當* 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指定可變長度參數。 –