1. *运算符
在方法定义中的参数列表里的最后一个参数前带一个星号( * )—-有时候也叫splat运算符,表示可以将多个参数传递给方法。那些参数被封装成一个数组。
def calculate_value(x, y, *otherValues)
p x, y, otherValues
end
calculate_value(1, 2, 'a', 'b', 'c')
结果如下:
1
2
["a", "b", "c"]
2. 将数组分解成参数
在调用方法时,如果以“ *数组名 ”形式指定方法的参数,这种情况传递给方法的就不是数组了!而是将数组扩展,并分解数组,将数组的各个元素按照顺序传递给方法。但需要注意,数组元素个数与方法定义中参数列表的参数个数一致。一一对应。
# 跟上个例子结果一致
def calculate_value(x, y, *otherValues)
p x, y, otherValues
end
array = ['a', 'b', 'c']
calculate_value(1, 2, *array)
除了用*运算符,还可以使用散列(Hash)。非常的有意思!
3. 把散列作为参数传递
在调用调用时,使用散列(Hash)同样可以达到可变参数长度。
结果是个散列。
def accepts_hash(var)
puts var
end
accepts_hash "arg1" => 'giving arg1', "argN" => 'giving argN' # 这个写法最简洁
accepts_hash("arg1" => 'giving arg1', "argN" => 'giving argN')
accepts_hash({"arg1" => 'giving arg1', "argN" => 'giving argN'}) # 比较繁琐的写法
结果:
{"arg1"=>"giving arg1", "argN"=>"giving argN"}
{"arg1"=>"giving arg1", "argN"=>"giving argN"}
{"arg1"=>"giving arg1", "argN"=>"giving argN"}
上面三个都输出一样的结果,但第一种没有没有()和没有散列定义的{},十分的简洁好看。同时这种用法也在Ruby on Rails中普遍使用。
如果想用散列定义的{},务必连同()一起使用。即上面例子中第三个方法调用。不然会报错。
不能直接用{~}
不能直接用{~}
不能直接用{~}
重要说三遍!!!
# 这是错误的用法
accepts_hash {"arg1" => 'giving arg1', "argN" => 'giving argN'}
4. 关键字参数
关键字参数是模仿散列作为参数传递的写法设计出来的。对键(key)进行了限制,又定义了每个参数的默认值(这里每个参数指的是关键字参数,如果有普通参数时可以不指定默认值的)。
因此,在调用方法中,参数个数跟方法定义的参数个数可以不一致,参数的顺序也可以自由的更改。
def test_method(a, b, c: 0, d: 0)
[a,b,c,d]
end
p test_method(3, 4, c: 5, d: 7)
p test_method(3, 4, d: 7) # 少一个
p test_method(3, 4, d: 7, c: 5) # 参数顺序不一致
结果:
[3, 4, 5, 7]
[3, 4, 0, 7]
[3, 4, 5, 7]
从上面的例子中,,不能写成p test_method(3, 4, 5, 7)
,这是错误的写法。必须要加上c: 和 d: 参数名。
如果把未定义的参数名传递给了方法,程序会报错。
使用“ **变量名 ”来接受未定义的参数名,可以避免调用方法时因指定了未定义的参数而报错
def meth(x: 0, y: 0, z: 0, **args)
[x, y, z, args]
end
p meth(z: 4, y: 3, x: 2)
p meth(x: 2, z: 3, v: 4, w: 5) # v和w就是未定义的参数名
结果:
[2, 3, 4, {}]
[2, 0, 3, {:v=>4, :w=>5}]