我正在研究ruby对象模型并且有一些问题。我理解一个对象只存储实例变量的想法,并且方法存储在类中,对象具有引用。我也理解“自我”的概念 - 它是什么,它是如何变化的等等。
然而,我不明白的是“类是对象”的概念。在任何地方都有一个好的,直观的解释吗?
(顺便说一句:我使用Ruby Object Model and Metaprogramming和Metaprogramming Ruby作为我的两个资源。如果有人可以提出其他建议,那将会有所帮助。)
感谢。
答案 0 :(得分:11)
这恰恰意味着什么 - 类是对象。具体来说,它们是类Class
的实例,它本身是类Module
的子类,而后者又是Object
的子类,就像Ruby中的每个其他类一样。与Ruby中的任何其他对象一样,类可以响应消息,拥有自己的实例变量等等。
作为一个实际例子,我们来看private
。
class Person
attr_accessor :name, :height
private
attr_accessor :weight
end
这给出了Person公共方法的实例来访问该人的姓名和身高,但该人的权重的访问者是私人的。 BUTBUTBUT - private
不是大多数语言中的关键字,而是Module类的普通方法。如果我们想要,我们可以重新定义它,为特定的类层次结构做一些不同的事情。
class RichardStallman
def self.private(*args)
puts "NO! INFORMATION WAS MEANT TO BE FREE!"
end
end
答案 1 :(得分:9)
这是我的一次拍摄。
在Ruby中,类是对象。通常他们有班级Class
。例如,让我们考虑班级Foo
。
class Foo
end
毫无疑问,你以前见过这个,并不是非常令人兴奋。但我们也可以这样定义Foo
:
Foo = Class.new
正如您通过调用Foo
创建新Foo.new
一样,您可以通过调用Class
来创建新的Class.new
。然后通过分配名称Foo
为该类赋予它,就像任何其他变量一样。这就是它的全部内容。
答案 2 :(得分:5)
“类是对象”的概念(据我理解)意味着你可以用一个对象做任何事情,你可以用一个类来做。
这与其他编程语言不同,其他类和类定义是与对象不同的特殊工件,通常是运行时无法访问的。
例如在Ruby中,您可以在运行时修改任何对象,因为类也是对象,您可以自行修改类,在运行时添加方法,删除方法,或在运行时添加和删除属性。
例如:
$ irb
>> x = Object.new
=> #<Object:0x1011ce560>
>> x.to_s
=> "#<Object:0x1011ce560>"
>> undef to_s
=> nil
>> x.to_s
NoMethodError: undefined method `to_s' for #<Object:0x1011ce560>
from (irb):4
>>
在其他编程语言中不可能实现对象和类之间的区别。
注意:在进行元编程之前,你可能应该先理解基本的Ruby概念,因为它可能会让我感到困惑,这就是我要做的事情。
答案 3 :(得分:1)
看看这篇文章,你会发现它很有帮助:
The Ruby Object Model - Structure and Semantics
通过阅读Smalltalk(例如在Squeak文档中),我个人学到了很多关于Ruby对象模型的知识。根据您在C中的流利程度,MRI来源非常平易近人,可以得出最明确的答案。
答案 4 :(得分:0)
当你想到它时,new
成为一个函数是完全合乎逻辑的,对吗?一个创建并返回新对象的函数。 (与new
是某种运算符或语言结构的大多数其他语言不同。)
进一步推动,对于这个函数new
更合乎逻辑的是它应该是一个方法,如果我们讨论的是OO语言。谁的方法?一个对象的方法,只是一个不同类型的对象,我们可以称之为“类”。
所以,就这样看来,类只是特殊类型的对象,除了其他特性之外,还有方法new
并且知道如何根据自己的图像创建其他对象。