当* args传递给ruby中的yield时,在rails的capture_helper.rb中发生了什么?我看到一个声明,其中* args传递给yield声明,当我们做所以。当* args传递给ruby时产生了什么
buffer = with_output_buffer { value = yield(*args) }
其中第一个参数是生成器对象和第二参数是传递
当* args传递给ruby中的yield时,在rails的capture_helper.rb中发生了什么?我看到一个声明,其中* args传递给yield声明,当我们做所以。当* args传递给ruby时产生了什么
buffer = with_output_buffer { value = yield(*args) }
其中第一个参数是生成器对象和第二参数是传递
随着*
操作者(splat operator)前缀的变量(它必须是一个数组或散列),则数组的值是块提取:
ary = [1, 2, 3]
def foo(a, b, c)
a + b + c
end
foo(ary)
# => ArgumentError: wrong number of arguments (given 1, expected 3)
foo(*ary)
# 6
这只是与yield
相同,不同的是值传递到块:
def bar
ary2 = [5, 6]
yield(*ary2)
end
bar do |x, y|
puts x + y
end
# 11
但是,我已经看到的大部分代码*都用于方法定义中,以接受任意数量的参数而不是参数列表 – Akshay
Splats在红宝石中有很多用途。当您在方法调用中使用splat时,它会将数组转换为参数列表。
def test(*args)
args
end
考虑以下示例:
a = [1,2,3]
test(a)
# => [[1, 2, 3]]
test(1,2,3)
# => [1, 2, 3]
test(*a)
# => [1, 2, 3]
在阵列被视为第一个参数所以结果是在阵列中的阵列的第一个例子。而*[1,2,3]
解构数组,以便我们获得所需的结果。
这使得它非常有用的调用采用可变数量的参数的方法。 yield
就像在这方面的任何其他方法一样工作,因为使用splat将在args
中解构数组,并用参数列表调用传递的块。
https://endofline.wordpress.com/2011/01/21/the-strange-ruby-splat / – max
可能重复[在哪里可以使用ruby splat运算符?](http://stackoverflow.com/questions/776462/where-is-it-legal-to-use-ruby-splat-operator) –
* args指定可变长度参数。 –