1

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 つの質問:

  1. poopメソッドを定義するときに新しいクラスが作成されたようには見えません。それとも、作成されたものの、「#class」メソッドが呼び出しをスーパークラスの #class に自動的にリダイレクトしたのでしょうか? どちらが正しい?どうやってチェックするの?

  2. 別のメソッド、たとえばcat.runを定義すると、別の固有クラスが作成されるかどうか? その場合、クラス階層はどうなりますか?

  3. catが「kate」に再定義された場合、うんち見つかりません。なんで?うんちは猫が利用できるべきではありませんか?

ありがとう!

4

1 に答える 1

3
  1. と を見てcat.singleton_classくださいcat.singleton_methods
  2. いいえ。いくつかのシングルトンメソッドを定義してcatから見てcat.singleton_class.instance_methodsください。両方がそこに表示されます。で階層についてのヒントを得ることができますcat.singleton_class.ancestors
  3. catこれで、まったく新しいオブジェクトを定義できました。なぜ同じメソッドを持つのでしょうか? と言えばcat = "string"、 をコールできますcat.upcaseが、後で を再割り当てするcat = 5と、もちろん、 をコールすることはできませんcat.upcase
于 2014-07-13T05:41:41.273 に答える