1、Ruby的函数可以不使用括号
def h(name) puts "hello #{name}" end h "jack"
2、python可以直接访问实例的属性,ruby不行,且Ruby的类名必须以大写字母开头
为什么python需要self:假如创建了一个类MyClass,实例化MyClass得到了MyObject这个对象,然后调用这个对象的方法MyObject.method(arg1,arg2) ,这个过程中,Python会自动转为Myclass.mehod(MyObject,arg1,arg2)
self在Python里不是关键字。self代表当前对象的地址。
>>> class greeter: ... def __init__(self,name): ... self.name=name ... >>> g=greeter("jack") >>> g.name 'jack' >>>
class Greeter def initialize(name) @name = name end end => :initialize g = Greeter.new("jack")
无论是g.name还是g.@name都会报错。在Ruby中,实例变量是被隐藏起来的,但是可以通过为类添加访问属性的方法来获取属性值。把一个类打开然后改变它,会对以后生成的甚至是已经生成的对象产生即时效果。
class Greeter attr_accessor :name end => nil
g.name => "jack"
attr_accessor
会自动为我们定义两个新的函数, name
用来读取变量的值, name=
用来给变量赋值。在改变了类之后,我们之前创建的Greeter的实例g也被改变了,能够通过g.name访问name属性了
3、ruby并不是严格缩进的,下面这样的代码也可以运行
class MegaGreeter attr_accessor :names def initialize(names = "World") @names = names end end
4、ruby判断真值时,只有 false
和 nil
当做假值。其余一切皆为真(包括 0
、 0.0
、 ""
和 []
)。
a=0 if a puts "yes" else puts "no" end =>yes
5、优雅的循环
@names.each do |name| puts "Hello #{name}!" end
for name in names: print("Hello %s!"%name)
Ruby 的方法对比来看就更清爽,所有的清理工作都被隐藏在 each
函数里了, 您只需要告诉它您想做什么。在 each
函数内部,实际上会去自动调用 yield "Albert"
,yield "Brenda"
,yield "Charles"
,等等。
6、ruby不限制函数所支持的参数类别。 如果有人写了一个新的类,只要它像其他列表类一样回应 join
这个函数, 那它就可以被相应的其他函数所使用。
if @names.respond_to?("join")
if callable(getattr(greeter,"join",None)):
7、“如果这是启动脚本”
if __name__ == '__main__':
if __FILE__ == $0
8、ruby的表达式和语句没有区别。任何表达方法都有返回值
9、类似 Python, 从 Ruby 2.0 开始,可以使用关键字参数定义方法
10、nil is a object
def test_nil_is_an_object assert_equal true, nil.is_a?(Object), "Unlike NULL in other languages. But, like None in python." end