继续上次Ruby的学习。接下来就到了Ruby的方法。数组
Ruby的方法与Python仍然很像。使用def
定义,能够使用undef
取消定义。
在Ruby中,常常能够看见方法后面跟有“?”或“!”。这实际上是方法名的一部分。
带有“?”表示返回一个布尔值;带有“!”表示方法会修改对象自身。
以Array类为例:函数
empty?
返回数组是否为空。至关于isEmpty
。sort!
表示会对数组原地排序。sort
则返回一个排好序的副本,自身不会改变。Ruby的方法能够无参数,有多个参数,甚至可变数量的参数。学习
对于多个参数,不支持Python式的指定参数,但能够借助字典实现。code
method('a'=>1, 'b'=>2)
可变参数与Python相似。对象
def sum(*num) result = 0 num.each {|i| result += i} return result end
由于Ruby中变量不表示类型,并且又支持缺省参数,因此方法不支持重载。可是支持重写。排序
方法的返回值为return
表达式的值,或者为最后一条语句的值。若是return
不带参数,则返回nil
;若是有多个参数,则返回一个数组。for循环
Ruby还有一个有趣的东西叫作block。虽然有传统的for循环,但Ruby更经常使用的是each循环,这里就用到了block。匿名函数
block有这么几种使用形式:变量
def method yield end def method(&p) p.call end method { puts "Hello" }
这里的&p
是什么?p
表示的是一个Poroc
对象。Proc表示Procedure。&
表示将Proc
对象转换为block。Proc
和block的主要区别在于Proc
对象能够保存,重复使用,而block不能。若是须要再次使用,能够用Proc.new()
或proc()
将block转换成Proc
对象。lambda
还有一个与block很类似的lambda表达式。它的样子像这样:
lambda {|x| puts x}
长得虽像,但lambda是匿名函数,block是代码块。
因此它和block主要有两个区别: