与えられた Ruby コード
line = "first_name=mickey;last_name=mouse;country=usa"
record = Hash[*line.split(/=|;/)]
オペレーター以外の 2 行目の内容はすべて理解してい *
ます - オペレーターは何をしていて、これに関するドキュメントはどこにありますか? (ご想像のとおり、このケースを検索するのは難しいことがわかっています...)
はスプラット演算子です*
。
を引数のリストに展開します。Array
この場合は、メソッドへの引数のリストですHash.[]
。(より正確には、to_ary
/に応答するオブジェクトto_a
、またはto_a
Ruby 1.9 で展開されます。)
たとえば、次の 2 つのステートメントは同じです。
method arg1, arg2, arg3
method *[arg1, arg2, arg3]
メソッド定義で残りのすべてのメソッド引数をキャッチするために、別のコンテキストで使用することもできます。その場合、展開はしませんが、結合します:
def method2(*args) # args will hold Array of all arguments
end
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
それでおしまい!
皆さんおっしゃる通り「スプラ」です。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"}