2016-12-05 83 views
-1

当* args传递给ruby中的yield时,在rails的capture_helper.rb中发生了什么?我看到一个声明,其中* args传递给yield声明,当我们做所以。当* args传递给ruby时产生了什么

buffer = with_output_buffer { value = yield(*args) } 

其中第一个参数是生成器对象和第二参数是传递

+4

可能重复[在哪里可以使用ruby splat运算符?](http://stackoverflow.com/questions/776462/where-is-it-legal-to-use-ruby-splat-operator) –

+0

* args指定可变长度参数。 –

回答

2

随着*操作者(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 
+1

但是,我已经看到的大部分代码*都用于方法定义中,以接受任意数量的参数而不是参数列表 – Akshay

0

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中解构数组,并用参数列表调用传递的块。

+0

https://endofline.wordpress.com/2011/01/21/the-strange-ruby-splat / – max

相关问题