20958


[merge two arrays into a hash - Ruby Forum](https://www.ruby-
forum.com/topic/125944)を参考に2つのArrayからHashを作る方法を書きました。

[code]

    keys = %i(a b c)
    values = [1,2,3]
    Hash[*keys.zip(values).flatten] #=> {:a=>1, :b=>2, :c=>3}
    
[/code]

この場面に出てくる`*`の意味はなんでしょうか？

[code]

    p *keys
    
[/code]

とした場合

> :a  
>  :b  
>  :c

と出力されてしまいますし、RubyMineのブレイクポイントで確認しようとすると、

[code]

    0> *keys
    => /Users/shingo/Documents/sample/hoge.rb:3: syntax error, unexpected '.', expecting '='
    (*keys).inspect
    
[/code]

となってしまいます。


CC BY-SA 3.0
2016-01-15T12:18:25.853
20952
2016-01-18T12:36:37.730
9008
question
ruby
2つのArrayからHashを作る方法に出てくる*の意味は何でしょうか？


ドキュメント<http://docs.ruby-lang.org/ja/2.3.0/doc/spec=2fcall.html>に記述があります。

> 最後の引数の直前に * がついている場合、その引数の値が展開されて渡されます

今回の例では、`keys.zip(values).flatten` の結果の `[:a, 1, :b, 2, :c, 3]`
が展開されて、`Hash[:a, 1, :b, 2, :c, 3]` という呼び出しになり、その結果、`{:a=>1, :b=>2, :c=>3}`
が得られています。


CC BY-SA 3.0
2016-01-15T13:53:57.077
20958
2016-01-15T13:53:57.077
3249
20952
answer


先の回答で理解できたかと思いますが、*によって引数の値が展開されます。

[code]

    [1] pry(main)> keys = %i(a b c)
    => [:a, :b, :c]
    [2] pry(main)> *keys
    SyntaxError: unexpected '\n', expecting '='
    [2] pry(main)> :a, :b, :c
    SyntaxError: unexpected '\n', expecting '='
    
[/code]

※ `*keys` は `:a, :b, :c` と同じ意味となります。

以上、補足まで。


CC BY-SA 3.0
2016-01-16T01:29:00.657
20961
2016-01-18T12:36:37.730
2016-01-18T12:36:37.730
9008
14015
20952
answer