2011-08-19 10 views
2

ブックプログラミングRubyのを読みながら、一例としては、ブロックがクロージャとして使用する方法を示していますRubyでは、なぜ文字列にintをブロックにクロージャとしてブロックすることができますか?

def nTimes(aThing) 
    return proc {|n| aThing * n} 
end 

p = nTimes("Hello ") 

今、私たちは出力p.call(3)の価値を私たちの場合、それは、しかしHello Hello Hello

であるかどうコードは単にputs 3 * "Hello "であり、Rubyは互換性のないタイプについて文句を言うでしょう。

なぜですか?ありがとう。

+1

「puts」Hello「* 3」を試しましたか? –

+1

ああ私はとても恥ずかしいです。ありがとうございました。 –

+0

私はRubyを本当に知りません。私は、リンゴがリンゴと比較されていないことに気付いた。それは、Rubyで両方の方法がうまくいかない理由の説明を見るのは興味深いだろう...それはPythonでやっている。 –

答えて

6

問題はクロージャやブロックとは関係ありません。これは、Rubyでの演算子の処理方法に関連しています。オペランドの左側に*+等バイナリ操作に

オブジェクトは、メソッドの受信機です。したがって、"hello " * 3を実行すると、Stringクラスの*メソッドが呼び出され、3がパラメータとして渡されます。 String#*の定義では、パラメータとして整数が使用され、何度も繰り返されるselfが返されるため、出力は"hello hello hello "となります。

しかし3 * "hello "として、あなたのフレーズ、それをすれば、Fixnumクラスの*メソッドが呼び出され、そして"hello "がパラメータとして渡されます。 Fixnum#*Stringパラメータの処理方法を知らないため、エラーが発生します。

+0

ありがとう!私はすぐに私の質問の下で最初のコメントを読んでそれを実現しました。しかし、あなたの説明は間違いなく正確です。 –

+0

:)これはRubyを学ぶ人々の共通の落とし穴だと思いました(私は数年前に同じことをやっています)。類似の質問を探す人を助けるかもしれません。 – edgerunner

関連する問題