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


174

Rubyコードを考える

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

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

回答:


271

*あるスプラットのオペレーター。

これは、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

ここにいくつかのより詳細な情報


36
一般に、LHSのような状況で使用した場合(値で呼び出している場合はいつでも)、splatは配列を個別の値に分割し、RHSのような状況で使用した場合(使用している場合)以前は未定義だった一部の変数)では、個別の値を配列にグループ化します。したがってa,b,*c = d,e,f,*g、a = d、b = e、c = [f、g0、g1、g2、...、gn]を設定します。ここで、g = [g0、g1、g2、...、gn]
ランプオン

2
ただ、完全を期すため、スプラットのオペレータは、デビッド・A・ブラックによって「十分な接地Rubyist」で使用される用語に応じ裸リストに配列を回す
デヴィッド・バロウズ

12
@rampion:素晴らしいコメント、LHSとRHSを混ぜただけです。それは逆です。
ThomasH 2009

46

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

それでおしまい!


6

みんなが言うように、それは「感嘆符」です。Ruby構文を探すことは不可能であり、私はこれを他の質問で尋ねました。質問のその部分に対する答えは、あなたが検索することです

asterisk in ruby syntax

Googleで。グーグルはあなたのためにそこにあります、あなたが見るものを言葉に入れてください。

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

line.split(/=|;/)

SIX要素の配列を作成し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"}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.