我是一名学习Ruby的C ++程序员。在一本初学者书中,我读到:
“类本身就是一个对象,即使你没有直接实例化它。”
我不知道如何解释。
答案 0 :(得分:6)
在C ++中,除了typeid
等之外,没有类的语言可见运行时表示。你可以说class Foo {};
,但是你不能说&Foo
。 (您可以获取typeid
对象的typeinfo
/地址,这是一个类对象的混合版本。)
在Ruby中,类是对象。你可以用一个对象做任何事情,你可以用一个类做,因为它是一个对象。例如,在Ruby中,您可以foo.send(...)
到任何对象foo
。由于一个类是一个对象,你可以像Foo.send(...)
一样。
关于“你没有实例化”的部分是指通常你在Ruby中说foo = Foo.new
这个事实,但是你不需要对类进行说明。类对象由运行时创建。 (事实上,Ruby中的class Foo; end
与Foo = Class.new
非常相似。)
答案 1 :(得分:3)
在Ruby中,一切都是对象。这包括课程。所以当你宣布
时class Thing
end
您已经创建了名为Class
的{{1}}类的实例。它与
Thing
将“直接实例化”Thing = Class.new
的实例。
答案 2 :(得分:1)
Ruby中的所有东西都是一个对象,甚至是类本身。
class Test
def self.foo
"bar"
end
def yin
"yang"
end
end
# This creates a new instance and calls #yin
Test.new.yin # => "yang"
# This calls the #foo method on the Test class object.
Test.foo # => "bar"
答案 3 :(得分:1)
在其他一些语言中,你有一种叫做“抽象类”的东西。这些东西本身不是对象,也不能真正做任何事情。它们更像是用于创建实际对象的模板。实际对象可以执行诸如运行方法,接受参数等操作。抽象类不能执行任何操作,主要用于创建实际对象。当从它们创建对象时,它被称为“实例化”对象。
现在在ruby中,你没有抽象类。用于从(实例化)派生对象的类在某些方面有点像抽象类。但是与抽象类不同,ruby中的这个类本身已经可以做了。
这就是你引用的语句“一个类本身就是一个对象,即使你没有直接实例化它”也试图弄清楚。它在抽象类的意义上不是虚拟的。相反,它已经是一个完整的对象。
答案 4 :(得分:0)
这一切真正意味着您可以像处理这些类的实例一样对待类。
class Animal; end
bird = Animal.new
您现在可以Animal
使用bird
。
e.g。
Animal.methods => 'list of methods'
bird.methods => 'list of methods'
这就是真的。