1

对 Ruby 元编程感到困惑。

所以从教程中我学到了以下内容:

cat = "kitty"
cat.upcase  # "KITTY"
cat.poop    # undefined 'poop'

def cat.poop
  puts 'pooooooo...'
end

cat.upcase  # "KITTY"
cat.poop    # "pooooooo..."

所以这意味着poop方法已经用于cat对象,它属于String类。从著名的教科书《Ruby 编程》中,通过定义cat.poop,实际发生的是 Ruby 创建了一个匿名类,也就是单例或特征类,现在是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_classcat.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 回答