2016-12-05 1 views
-1

ruby​​でyieldsが渡されたときに何が起こるか、レールのcapture_helper.rbで何が起こるか* argsがyield文に渡されるステートメントを見た。そう。最初のパラメータは、ビルダーオブジェクトと第二パラメータであるルビでyieldするために* argsが渡されたときどうなるか

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

*オペレータ(splat operator)(配列やハッシュでなければならない)変数を接頭辞、配列の値であると

+4

[ルビスプラット演算子を使用するにはどうすればよいですか?](http://stackoverflow.com/questions/776462/where-is-it-legal-to-use-ruby-splat-operator) –

+0

* argsは可変長引数を指定します。 –

答えて

2

を通過したブロックであります抽出された:

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とちょうど同じです210

def bar 
    ary2 = [5, 6] 
    yield(*ary2) 
end 

bar do |x, y| 
    puts x + y 
end 
# 11 
+1

しかし、ほとんどのコードは、引数リストではなく任意の数のパラメータを受け入れるためにメソッド定義に使用されています。 – Akshay

0

スプラットは、ルビーで多くの用途があります。メソッド呼び出しでスプラットを使用すると、配列を引数のリストに変換します。

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

関連する問題