Ruby eigenclass(单例类)创建了吗?为了哪个?

时间:2014-07-13 05:31:04

标签: ruby metaprogramming eigenclass

对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个问题:

  1. 在定义 poop 方法时,似乎没有创建任何新类。或者它可能是创建的,但是&#34; #class&#34;方法自动将调用重定向到超类&#39; #类?哪个是对的?我们如何检查?

  2. 如果我们定义另一个方法,比如 cat.run ,那么是否会创建另一个本征类?那么类层次结构会是什么?

  3. 如果将 cat 重新定义为&#34; kate&#34;,则找不到 cat 。为什么?不应该为猫提供便便吗?

  4. 谢谢!

1 个答案:

答案 0 :(得分:3)

  1. 查看cat.singleton_classcat.singleton_methods
  2. 否。在cat上定义几个单例方法,然后查看cat.singleton_class.instance_methods,您将在那里看到它们。您可以使用cat.singleton_class.ancestors
  3. 获取有关层次结构的提示
  4. 您现在已将cat定义为一些全新的对象。为什么它有相同的方法?如果你说cat = "string",那么你可以致电cat.upcase,但如果你以后重新分配cat = 5,当然你仍然可以致电cat.upcase