6

次のコードを実行すると、最初の 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 を実行しています。

4

2 に答える 2

7

そうですね、ナミダさんがおっしゃったように、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)
于 2012-10-01T08:02:58.473 に答える
0

3行目to_sでは、「スプラット」が2のメソッドを呼び出しています。これは、(メソッド呼び出しで)2と評価されるため、別のベースの数値を返します。

于 2012-10-01T08:06:21.830 に答える