次のコードを実行すると、最初の 2 行で期待どおりの結果が返されます。ただし、3 番目は 2 のバイナリ表現を返します。
2.to_s # => "2"
2.to_s * 2 # => "22"
2.to_s *2 # => "10"
呼び出し時に 2 を渡すとto_s
出力がバイナリに変換されることはわかっていますが、3 番目のケースでをto_s
無視するのはなぜですか? *
違いがある場合は、Ruby 1.9.2 を実行しています。
次のコードを実行すると、最初の 2 行で期待どおりの結果が返されます。ただし、3 番目は 2 のバイナリ表現を返します。
2.to_s # => "2"
2.to_s * 2 # => "22"
2.to_s *2 # => "10"
呼び出し時に 2 を渡すとto_s
出力がバイナリに変換されることはわかっていますが、3 番目のケースでをto_s
無視するのはなぜですか? *
違いがある場合は、Ruby 1.9.2 を実行しています。
そうですね、ナミダさんがおっしゃったように、Ruby は解釈します。
2.to_s *2
なので
2.to_s(*2)
Ruby ではメソッド呼び出しの括弧はオプションであるためです。ここでのアスタリスクは、いわゆるスプラット演算子です。
ここで唯一不可解な質問は、なぜ が と*2
評価されるのかということ2
です。メソッド呼び出しの外で使用すると、splat 演算子はすべてを配列に強制するため、
a = *2
となりa
ます[2]
。メソッド呼び出しでは、splat 演算子は逆のことを行います。一連のメソッド引数として何でもアンパックします。3 メンバー配列を渡すと、3 つのメソッド引数になります。スカラー値を渡すと、単一のパラメーターとして転送されます。そう、
2.to_s *2
本質的に同じです
2.to_s(2)
3行目to_s
では、「スプラット」が2のメソッドを呼び出しています。これは、(メソッド呼び出しで)2と評価されるため、別のベースの数値を返します。