2016-12-05 58 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

相關問題