ruby对象模型的良好解释——主要是&x27;类是对象';?

ruby对象模型的良好解释——主要是&x27;类是对象';?,ruby,Ruby,我正在研究ruby对象模型,有一些问题。我理解对象只存储实例变量,方法存储在类中的想法,对象引用了类。我也理解“自我”的概念——它是什么,它是如何变化的,等等 然而,我不明白的是“类是对象”的概念。有没有一个好的、直观的解释 (顺便说一句:我正在使用和作为我的两个资源。如果有人能提出其他建议,那将很有帮助。) 谢谢。这是我的第一枪 在Ruby中,类是对象。通常他们有classclass。例如,让我们考虑类 fo .< class Foo end 毫无疑问,你以前见过这种情况,也不太令人兴奋。但

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

然而,我不明白的是“类是对象”的概念。有没有一个好的、直观的解释

(顺便说一句:我正在使用和作为我的两个资源。如果有人能提出其他建议,那将很有帮助。)

谢谢。

这是我的第一枪

在Ruby中,类是对象。通常他们有class
class
。例如,让我们考虑类<代码> fo .<
class Foo
end
毫无疑问,你以前见过这种情况,也不太令人兴奋。但我们也可以这样定义
Foo

Foo = Class.new
正如通过调用
Foo.new
创建新的
Foo
一样,您也可以通过调用
Class.new
创建新的
Class
。然后通过赋值给该类命名为
Foo
,就像其他变量一样。这就是它的全部。

类就是对象的概念(我的理解是)意味着你可以用对象做任何事情,你可以用类来做

这与其他编程语言不同,在其他编程语言中,类和类定义是不同于对象的特殊工件,并且运行时通常不可访问

例如,在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
>> 
$irb
>>x=Object.new
=> #
>>x.to_
=> "#"
>>未定义到
=>零
>>x.to_
NoMethodError:未定义的方法“to_s”#
来自(irb):4
>> 
这在其他编程语言中是不可能的,因为在这些语言中对象和类是有区别的


注意:在进行元编程之前,您可能应该理解基本的Ruby概念,因为这可能会让人困惑,我会这么做。

它的意思正是它听起来的样子——类是对象。具体地说,它们是类
的实例,该类本身是类
模块
的子类,而该类又是
对象
的子类,就像Ruby中的其他所有类一样。与Ruby中的任何其他对象一样,类可以响应消息,拥有自己的实例变量,等等

作为一个实际的例子,让我们以
private
为例

class Person
  attr_accessor :name, :height
  private
  attr_accessor :weight
end
这提供了Person公共方法的实例来访问此人的姓名和身高,但访问此人体重的访问器是私有的。ButBut-与大多数语言中的关键字不同,
private
是模块类的一个普通方法。如果我们愿意,我们可以重新定义它,为特定的类层次结构做一些不同的事情

class RichardStallman
  def self.private(*args)
    puts "NO! INFORMATION WAS MEANT TO BE FREE!"
  end
end

想想看,
new
作为一个函数是完全合乎逻辑的,对吧?创建并返回新对象的函数。(与大多数其他语言不同,
new
是某种运算符或语言构造。)

更进一步说,如果我们谈论的是一种OO语言,那么这个函数
new
更符合逻辑的一点是,它应该是一种方法。谁的方法?一个对象的方法,只是一个稍微不同的类型的对象,我们可以称之为“类”


因此,从这个角度来看,类只是特殊类型的对象,除了其他特性外,这些对象具有method
new
,并且知道如何根据自己的图像创建其他对象。

看看这篇文章,您可能会发现它很有帮助:


就我个人而言,通过阅读Smalltalk模型(例如,在文档中),我学到了很多关于Ruby对象模型的知识。根据你在C语言中的流利程度,MRI来源是非常容易接近的,并给出了最明确的答案。

使用Ruby一段时间后,我遇到了完全相反的问题:我们为什么要购买类不是对象的语言……试试“有良好基础的Rubyist”大卫·布莱克(David Black)——值得注意的是,许多其他语言都有这个功能(特别是Smalltalk;许多其他语言都是从Smalltalk借用的)