对 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个问题:
在定义poop方法时,似乎没有创建任何新类。或者它是创建的,但是“#class”方法自动将调用重定向到超类的#class?哪个是对的?我们如何检查?
如果我们定义另一个方法,比如cat.run,那么是否会创建另一个特征类?那么类层次结构是什么?
如果cat被重新定义为“kate”,则找不到便便。为什么?大便不应该给猫吃吗?
谢谢!