Ruby基础知识-5.函数
1.1 函数定义
Ruby中函数通过def…end方式定义。
def fib(n)
(n==1 || n==2) ? 1 : fib(n-1)+fib(n-2)
end
puts fib(7) #13
其中fib为函数名,n为函数参数。如果要返回值可使用return,如果没有指定return,则以最后一个语句执行结果的返回值,作为函数的返回值。
在ruby中可以为对象单独定义方法,和JavaScript类似。
obj = Object.new
def obj.fib(n)
(n==1 || n==2) ? 1 : fib(n-1)+fib(n-2)
end
puts obj.fib(7) #13
上例中,为obj定义了fb 单例方法(Singleton method)。如果在顶层环境中定义方法时,没有指定方法由哪个对象拥有,则方法是由Object拥有的私有(private)实例方法(Instance method)。
上面范例的fb方法,相当于以下写法:
class Object
#以下定义了fib实例方法
def fib(n)
(n==1 || n==2) ? 1 : fib(n-1)+fib(n-2)
end
private :fib
end
定义在顶层的方法没有指定拥有者时,就是Object拥有的私有实例方法,Object为所有类别的父类别,因此任何类或模组定义中,就可以直接调用。
调用方法时没有指定讯息接收者,预设以self为讯息接收者,如果是调用私有方法,不用也不能撰写self,因为私有方法只能在物件内部使用,不可透过object.method的方式调用。
1.2 函数参数
在 Ruby 中不支持其它语言重载方法的概念,也就是在 Ruby 中同一个名称空间中,不能有相同的方法名称。如果你定义了两个方法具有相同的名称但拥有不同的参数个数,则后者定义会覆盖前者定义。
由于 Ruby 是动态语言,只需在设计时确认传入方法的对象所拥有的特性或方法,对于以参数个数不同来区别的方法重载概念,在 Ruby 中可以使用预设引数( Argument )来解决。例如:
def sum(a, b, c = 30)
a + b + c
end
puts sum(10, 20, 30) #显示60
puts sum(10, 20) #显示60
像sum这种加总数字的需求,事先可能不知道要传入的参数个数,可以在定义方法的参数时使用*,表示该参数接受不定长度引数。例如:
def sum(*numbers)
total = 0
numbers.each do |number|
total += number
end
total
end
puts sum(1, 2) #显示3
puts sum(1, 2, 3) #显示6
puts sum(1, 2, 3, 4) #显示10
你传入方法的引数,会被收集在一个数组中,再设定给numbers参数。*可以用来拆解数组,将元素逐一指定给数个变量,这个语法也适用在方法的参数指定,你可以将一个数组传入,只要在传入时加上*,则数组中每个元素会自动指定给各个参数。例如:
def sum(a, b, c)
a + b + c
end
numbers = [1, 2, 3]
puts sum(*numbers) #显示6
如果方法中传回数组,也可以这样指定。例如:
def some
[1, 2, 3]
end
x, y, z = some
puts "#{x}, #{y}, #{z}" #显示1, 2, 3