Ruby:方法中可变长度参数列表

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_24805141/article/details/53244814

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}]
展开阅读全文

没有更多推荐了,返回首页