在ruby中定义方法时,传入参数的方式是非常灵活的.
传入的参数可以分为以下种类型:
- 必选的参数 required arguments
def method(a, b)
end
这样当你调用该方法时必须同时传入两个方法
method("allen", 25")
- 带有默认值的参数
def method(a, b, c=100)
end
调用:
method('allen', 'age', 50) #=> 调用时传入c参数 a是"allen", b是"age", c是50
method('allen', 'age') #=> 调用时不传入c参数参数 a是"allen", b是"age", c是默认值100
- 可选的参数,如果你想在运行的时候再决定要传的参数类型和数量,那要在参数前面加上一个特殊的星号(*).
def method(*p)
end
这样你在调用方法的时候可以传入任何数量和类型的参数,包括none.
method
method(25)
method('tom', 'age', 25)
以上三种调用方式都是合法的,如果调用method时不传入参数,p表示一个空数组。如果传入多个参数,那么参数的值就是包含这些参数的数组。
def method(*p)
p
end
method(1,2,'hello') #=> [1,2,'hello']
- 多种参数配合使用:
上面介绍了三种参数,那么如何混合使用这些参数呢?
首先尝试下最简单的混合方式,必选参数 + 可选参数
def mix_method(a, b, *p)
#[a,b,p]
end
<p>比较容易理解,调用方式可以用以下两种:
mix_method(1,2) #参数对应值 a =>1, b => 2, p => []
mix_method(1,2, 3) #参数对应值 a =>1, b => 2, p => [3]
现在我们定义一个参数复杂些的方法,包含无规则顺序的必选和可选参数
def mix_method(a, b, *p, q)
#[a,b,p,q]
end
我们调用这个方法时可以传入3或者3个以上的参数,这种情况下必选参数会优先被指定,如果还有剩余的值会以数组的形式指定给可选参数
mix_method(1,2,3) # a => 1, b=>2, p => [], q => 3
mix_method(1,2,3,4) # a => 1, b=>2, p => [3], q => 4
mix_method(1,2,3,4,5) # a => 1, b=>2, p => [3, 4], q => 4
包含必选,可选和默认值的参数
def mix_method(a, b, c=100,*p, q)
# [a,b,c,p,q]
end
同样该方法可以传入3个和3个以上的参数
mix_method(1,2,3) # a => 1, b=>2, c => 100, p => [], q => 3
mix_method(1,2,3,4) # a => 1, b=>2, c => 3, p => [], q => 4
mix_method(1,2,3,4, 5) # a => 1, b=>2, c => 3, p => [4], q => 5
mix_method(1,2,3,4,5,6) # a => 1, b=>2, c => 3, p => [4,5], q => 6
- 通过上面的几个例子证明了ruby中定义方法参数的灵活性,但是定义方法时有一个准则必须遵守,那就是可选参数不能定义在带有默认值的参数之前,如:
def mix_method(a, b = 5, *p) #正确
def mix_method(a, *p, b = 5) #错误,会报一个语法错误