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

Pra*_*nav 12 ruby

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

但是,我不明白的是"类是对象"的概念.任何地方都有一个好的,直观的解释吗?

(顺便说一句:我使用Ruby对象模型和元编程以及元编程Ruby作为我的两个资源.如果有人可以提出其他建议,那将会有所帮助.)

谢谢.

Chu*_*uck 11

这恰恰意味着什么 - 类是对象.具体来说,它们是类的实例Class,它本身就是类的子类Module,而后者又是ObjectRuby的每个其他类的子类.与Ruby中的任何其他对象一样,类可以响应消息,具有自己的实例变量等.

作为一个实际的例子,我们来看看private.

class Person
  attr_accessor :name, :height
  private
  attr_accessor :weight
end
Run Code Online (Sandbox Code Playgroud)

这给出了Person公共方法的实例来访问该人的姓名和身高,但该人的权重的访问者是私人的.BUTBUTBUT - 而不是大多数语言中的关键字,private是Module类的普通方法.如果我们想要,我们可以重新定义它,为特定的类层次结构做一些不同的事情.

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


Dav*_*ler 9

这是我的一次拍摄.

在Ruby中,类是对象.通常他们有课Class.例如,让我们考虑一下这个课程Foo.

class Foo
end
Run Code Online (Sandbox Code Playgroud)

毫无疑问,你以前见过这个,并不是非常令人兴奋.但我们也可以这样定义Foo:

Foo = Class.new
Run Code Online (Sandbox Code Playgroud)

就像你Foo通过调用创建一个新的一样Foo.new,你可以Class通过调用创建一个新的Class.new.然后Foo通过赋值给该类命名,就像任何其他变量一样.这里的所有都是它的.


Osc*_*Ryz 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
>> 
Run Code Online (Sandbox Code Playgroud)

对于在对象和类之间进行区分的其他编程语言来说,这是不可能的.

注意:在进行元编程之前,你可能应该理解基本的Ruby概念,因为它可能会令人困惑,我会做什么.

  • 值得注意的是,许多其他语言**具有此功能(特别是Smalltalk;许多其他语言从那里借用). (3认同)
  • 实际上Ruby从Smalltalk那里拿走了这个 (3认同)