红宝石对象模型的好解释 - 主要是'类是对象'?

时间:2010-03-03 18:58:08

标签: ruby

我正在研究ruby对象模型并且有一些问题。我理解一个对象只存储实例变量的想法,并且方法存储在类中,对象具有引用。我也理解“自我”的概念 - 它是什么,它是如何变化的等等。

然而,我不明白的是“类是对象”的概念。在任何地方都有一个好的,直观的解释吗?

(顺便说一句:我使用Ruby Object Model and MetaprogrammingMetaprogramming Ruby作为我的两个资源。如果有人可以提出其他建议,那将会有所帮助。)

感谢。

5 个答案:

答案 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并且知道如何根据自己的图像创建其他对象。