web-dev-qa-db-ja.com

このRubyコードで(単項)*演算子は何をしますか?

Rubyコード

line = "first_name=mickey;last_name=mouse;country=usa" 
record = Hash[*line.split(/=|;/)] 

*演算子を除いて、2行目のすべてを理解しています。これは何をしていて、このドキュメントはどこにありますか? (ご想像のとおり、このケースを検索することは困難です...)

165
David Burrows

*splat演算子です。

Arrayを引数のリスト、この場合はHash.[]メソッドの引数のリストに展開します。 (より正確には、to_ary/to_a、またはRuby 1.9。)のto_aに応答するオブジェクトを展開します。)

例として、次の2つのステートメントは同じです。

method arg1, arg2, arg3
method *[arg1, arg2, arg3]

また、別のコンテキストで使用して、メソッド定義の残りのすべてのメソッド引数をキャッチすることもできます。その場合、それは展開しませんが、結合します:

def method2(*args)  # args will hold Array of all arguments
end

詳細情報はこちら

256
molf

Splatオペレーターは、関数に渡された配列をアンパックして、各要素が個別のパラメーターとして関数に送信されるようにします。

簡単な例:

>> def func(a, b, c)
>>   puts a, b, c
>> end
=> nil

>> func(1, 2, 3)  #we can call func with three parameters
1
2
3
=> nil

>> list = [1, 2, 3]
=> [1, 2, 3]

>> func(list) #We CAN'T call func with an array, even though it has three objects
ArgumentError: wrong number of arguments (1 for 3)
    from (irb):12:in 'func'
    from (irb):12

>> func(*list) #But we CAN call func with an unpacked array.
1
2
3
=> nil

それでおしまい!

41
BJ Homer

誰もが言及するように、それは「感嘆符」です。 Ruby構文は不可能です。他の質問でこれを尋ねました。質問のその部分に対する答えは、

asterisk in Ruby syntax

googleで。 Googleがあなたのためにあります。あなたが見たものを言葉にするだけです。

Anyhoo、多くのRubyコードのように、そのコードは非常に高密度です。

line.split(/=|;/)

sIX要素の配列、first_name, mickey, last_name, mouse, country, usa。次に、スプ​​ラットを使用してハッシュにします。 RubyすべてがRubyで公開されているので、人々はいつもSplatメソッドを見るためにあなたを送ります。配列を通してforを実行し、ハッシュを作成します。

core ドキュメントでコードを探します。あなたがそれを見つけることができない場合(私は見つけることができませんでした)、あなたはこのようなコードを書き込もうとします(これは動作しますが、Rubyのようなコードではありません):

line = "first_name=mickey;last_name=mouse;country=usa"
presplat = line.split(/=|;/)
splat = Hash.new
for i in (0..presplat.length-1)
    splat[presplat[i]] = presplat[i+1] if i%2==0
end

puts splat["first_name"]

そして、Rubyギャングは、コードが馬鹿げている、悪い、または単に間違っている理由を伝えることができます。

ここまで読んだ場合は、初期化に関する Hash のドキュメントを読んでください。

基本的に、いくつかの引数で初期化されるハッシュは、キーと値のペアとしてそれらを作成します。

Hash["a", 100, "b", 200] #=> {"a"=>100, "b"=>200}

あなたの例では、これは次のハッシュにつながります:

{"first_name"=>"mickey", "last_name"=>"mouse", "county"=>"usa"}
7
Dan Rosenstark