对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 。从着名的教科书&#34;编程Ruby&#34;,通过定义 cat.poop ,实际发生的事情是Ruby创建了一个匿名类,也就是单例或本征类,现在是< em> 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 方法时,似乎没有创建任何新类。或者它可能是创建的,但是&#34; #class&#34;方法自动将调用重定向到超类&#39; #类?哪个是对的?我们如何检查?
如果我们定义另一个方法,比如 cat.run ,那么是否会创建另一个本征类?那么类层次结构会是什么?
如果将 cat 重新定义为&#34; kate&#34;,则找不到 cat 。为什么?不应该为猫提供便便吗?
谢谢!
答案 0 :(得分:3)
cat.singleton_class
和cat.singleton_methods
。 cat
上定义几个单例方法,然后查看cat.singleton_class.instance_methods
,您将在那里看到它们。您可以使用cat.singleton_class.ancestors
cat
定义为一些全新的对象。为什么它有相同的方法?如果你说cat = "string"
,那么你可以致电cat.upcase
,但如果你以后重新分配cat = 5
,当然你仍然可以致电cat.upcase
。