この質問には2つの部分があります。クラスとインスタンスの拡張
Rubyプログラミング言語の書籍には、文字列オブジェクトとクラスをモジュールで拡張する例(8.1.1節)があります。
最初の質問です。新しいメソッドでクラスを拡張し、そのクラスのオブジェクト/インスタンスを作成すると、そのメソッドにアクセスできないのはなぜですか?
irb(main):001:0> module Greeter; def ciao; "Ciao!"; end; end
=> nil
irb(main):002:0> String.extend(Greeter)
=> String
irb(main):003:0> String.ciao
=> "Ciao!"
irb(main):004:0> x = "foo bar"
=> "foo bar"
irb(main):005:0> x.ciao
NoMethodError: undefined method `ciao' for "foo bar":String
from (irb):5
from :0
irb(main):006:0>
第2部Fixnumオブジェクトを拡張しようとすると、定義されていないメソッドエラーが発生します。誰かがなぜ文字列ではなくfixnumで動作するのか説明できますか?
irb(main):045:0> module Greeter; def ciao; "Ciao!"; end; end
=> nil
irb(main):006:0> 3.extend(Greeter)
TypeError: can't define singleton
from (irb):6:in `extend_object'
from (irb):6:in `extend'
from (irb):6
あなたの答えは、なぜ(私に)説明していません。他の言語では、クラスを変更し、そのクラスタイプの新しいオブジェクトを作成すると、新しいメソッドが取得されます。私は、クラスから無効なオブジェクトへの接続があることを前提にしています。その接続がここで有効でない理由を説明できますか? – teleball
あなたが私に与えた「インクルード」を調べることは助けになりました。だから今、私は拡張とインクルードの違いがあると分かっているように見え、今は何を検索するのか分かっているので、その違いを説明する記事があります:http://stackoverflow.com/questions/156362/what-ルビの包含と拡張の違い – teleball