很好地解释了ruby对象模型--主要是“类是对象”?

uubf1zoe  于 2023-01-30  发布在  Ruby
关注(0)|答案(6)|浏览(146)

我正在学习ruby对象模型,有一些问题。我理解对象只存储示例变量,方法存储在类中,对象引用类。我也理解“self”的概念--它是什么,它是如何变化的,等等。
然而,我不明白的是“类是对象”的概念,有没有好的、直观的解释?
(BTW:我使用Ruby Object Model and MetaprogrammingMetaprogramming Ruby作为我的两个资源。如果有人能提出其他建议,那将是很有帮助的。
谢谢。

bvn4nwqk

bvn4nwqk1#

这就是听起来的意思--类是对象,具体来说,它们是类Class的示例,类Class本身是类Module的子类,类Module又是类Object的子类,就像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
klh5stk1

klh5stk12#

我的机会来了。
在Ruby中,类是对象,通常有Class类,比如Foo类。

class Foo
end

毫无疑问,你以前见过这种情况,它并不令人兴奋,但我们也可以这样定义Foo

Foo = Class.new

就像你通过调用Foo.new创建一个新的Foo一样,你也可以通过调用Class.new创建一个新的Class,然后你通过赋值给予这个类命名为Foo,就像其他变量一样,这就是它的全部内容。

dgjrabp2

dgjrabp23#

"类是对象"的概念(我的理解是)意味着你可以用对象做的任何事情,你都可以用类来做。
这与其他编程语言不同,在其他编程语言中,类和类定义是不同于对象的特殊工件,并且通常不能由运行库访问。
例如,在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概念,因为这可能会让你感到困惑,这就是我要做的。

ax6ht2ek

ax6ht2ek4#

看看这篇文章,你可能会发现它很有帮助:
The Ruby Object Model - Structure and Semantics
就我个人而言,我通过阅读Smalltalk了解了很多关于Ruby对象模型的知识(例如,在Squeak文档中),并且根据您对C语言的熟练程度,MRI源代码非常容易理解,并能给出最明确的答案。

fd3cxomn

fd3cxomn5#

当你想到它的时候,new作为一个函数是完全合乎逻辑的,对吗?一个创建并返回一个新对象的函数。(不像大多数其他语言,new是某种运算符或语言构造。)
进一步说,对于这个函数new来说,更符合逻辑的是,它应该是一个方法,如果我们谈论的是面向对象语言,谁的方法?,一个对象的方法,仅仅是一个有点不同的对象,我们可以称之为“类”。
因此,从这个Angular 看,类只是特殊类型的对象,除了其他特性之外,类还具有方法new,并且知道如何基于它们自己的图像创建其他对象。

ttisahbt

ttisahbt6#

我不明白的是“类是对象”这个概念。有没有一个好的,直观的解释?
An answer to SO thread `Visual representation of Ruby Object Model'链接到一个关于这个主题的优秀视频。

相关问题