混淆类和对象之间的行为

时间:2014-08-07 06:08:10

标签: ruby metaprogramming

因为我们知道类也是类Class的对象。我在这里有疑问。 我有一个在这里定义的类Foo和一个打印对象的方法。

class Foo
  def bar
    puts self
  end
    puts self
end

当我做Foo.new.bar o / p将是# <Foo:0x935c740> 它代表了Foo类的一个对象。 为什么方法之外的self不打印#<Class: 0x..>作为类Class的对象? 对不起,如果我的问题有误,请澄清。

2 个答案:

答案 0 :(得分:3)

类和模块的名称在ruby中是不变的。因此,在定义类时,您正在创建类Class的对象并为其提供常量名称,因此当您在类上下文中执行puts self时,它会提供类名而不是{{1 }}

答案 1 :(得分:3)

这是定义类/对象的一种不同方式:

klass = Class.new {
  puts self
  def bar
    puts self
  end
}
# #<Class:0x3fbdbb8>

如您所见,它输出#<Class:0x3fbdbb8>。所以它的类是Class。您可以通过class方法检查:

klass.class
# => Class

当您第一次使用大写字母(例如Example)命名您的类时,它将其用作输出而不是隐藏名称,如:#<Class:0x3fbdbb8>

Foo = Class.new {
  puts self
  def bar
    puts self
  end
}

仍然输出含义模糊名称,因为Foo =的部分尚未评估尚未

puts Foo

输出正确的名称 - Foo

如果我再次命名怎么办?

Qux = Foo
# => Foo

无。 Foo永远是Foo