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