Ruby のメタプログラミングで混乱しました。
したがって、チュートリアルから次のことを学びました。
cat = "kitty"
cat.upcase # "KITTY"
cat.poop # undefined 'poop'
def cat.poop
puts 'pooooooo...'
end
cat.upcase # "KITTY"
cat.poop # "pooooooo..."
したがって、これはpoopメソッドがすでに、クラスStringのcatオブジェクト用であることを意味します。有名な教科書「Ruby のプログラミング」から、cat.poopを定義することで、Ruby が匿名クラス (singleton または eigenclass とも呼ばれる) を作成し、それがcatオブジェクトのクラスになり、元のStringクラスがそのスーパークラスになります。新しく作成された固有クラス。
それからこれは私を混乱させました。次のコードを参照してください。
cat.poop # "pooooooo...", it works, for sure
cat.class # "String" | but this is NOT some other class
cat = "kate"
cat.poop # poop not defined
3 つの質問:
poopメソッドを定義するときに新しいクラスが作成されたようには見えません。それとも、作成されたものの、「#class」メソッドが呼び出しをスーパークラスの #class に自動的にリダイレクトしたのでしょうか? どちらが正しい?どうやってチェックするの?
別のメソッド、たとえばcat.runを定義すると、別の固有クラスが作成されるかどうか? その場合、クラス階層はどうなりますか?
catが「kate」に再定義された場合、うんちは見つかりません。なんで?うんちは猫が利用できるべきではありませんか?
ありがとう!