186

与えられた Ruby コード

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

オペレーター以外の 2 行目の内容はすべて理解してい *ます - オペレーターは何をしていて、これに関するドキュメントはどこにありますか? (ご想像のとおり、このケースを検索するのは難しいことがわかっています...)

4

3 に答える 3

285

スプラット演算子です*

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

たとえば、次の 2 つのステートメントは同じです。

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

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

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

詳細についてはこちらをご覧ください

于 2009-05-27T23:27:33.783 に答える
51

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

それでおしまい!

于 2009-05-27T23:28:21.007 に答える
7

皆さんおっしゃる通り「スプラ」です。Ruby 構文を探すことは不可能であり、他の質問でこれを尋ねました。質問のその部分に対する答えは、あなたが検索することです

asterisk in ruby syntax

Googleで。Google はあなたのためにそこにいます。あなたが見たものを言葉にするだけです。

とにかく、多くの Ruby コードと同様に、そのコードは非常に密集しています。の

line.split(/=|;/)

は、6 つの要素の配列を作成しfirst_name, mickey, last_name, mouse, country, usaます。次に、スプ​​ラットを使用してそれをハッシュにします。現在、Ruby の人々は、すべてが Ruby で公開されているため、Splat メソッドを確認するように常に送信されます。それがどこにあるかはわかりませんが、一度それをfor取得すると、配列を介して実行され、ハッシュが構築されることがわかります。

コアドキュメントでコードを探します。見つからない場合 (私は見つけられませんでした)、次のようなコードを作成してみてください (動作しますが、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["a", 100, "b", 200] #=> {"a"=>100, "b"=>200}

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

{"first_name"=>"mickey", "last_name"=>"mouse", "county"=>"usa"}
于 2009-05-28T00:20:56.220 に答える