Ruby 新的和新的一样的东西?

Ruby 新的和新的一样的东西?,ruby,Ruby,类class的类方法版本为new,实例方法版本为new。但是因为Class是Class的一个实例,所以new的类方法版本不就是new的实例方法版本吗 当我看到下面 >Class.new => # 我认为Class对象是Class的一个实例,因此new是类Class的一个实例方法。相反,new是类class的类方法,它们是不同的 Class::new使用给定的 超类。 Class.new调用allocate来创建 类的类,然后调用该对象的initialize方法,传递 它是args 如果您单击上

class
的类方法版本为
new
,实例方法版本为
new
。但是因为
Class
Class
的一个实例,所以
new
的类方法版本不就是
new
的实例方法版本吗

当我看到下面

>Class.new
=> #
我认为
Class
对象是
Class
的一个实例,因此
new
是类
Class
的一个实例方法。相反,
new
是类
class

的类方法,它们是不同的

Class::new
使用给定的 超类。
Class.new
调用allocate来创建 类的类,然后调用该对象的initialize方法,传递 它是args

如果您单击上面的文档链接上的“切换源”,您可以看到这一点

基本上
Class.new
是ruby中每隔一个类继承的默认初始值设定项。

Class::new
创建一个新的匿名类。

Class::new
Class#new
是相同的

从某种意义上说,它们实际上是指同一种方法。但是,它们的行为非常不同,因为该方法反过来调用其他方法。(解释如下)

就像其他类(
String.new
Array.new
等)中的
new
方法一样,
Class.new
解析为
Class\new
。Ruby类通常不提供自己的
new
class方法。我们可以很容易地通过替换
类#新的
来确认这一点:

String.new #=> ""
Array.new  #=> []
Class.new  #=> #<Class:0x00007fef2517f5e0>

class Class
  def new(*args)
    "it's me, Class#new"
  end
end

String.new #=> "it's me, Class#new"
Array.new  #=> "it's me, Class#new"
Class.new  #=> "it's me, Class#new"
因此,
Class#new
是一个简单的方法–实际工作是通过
allocate
initialize
完成的。这就是区别的来源。通过检查
initialize
我们可以看到,对于
Class#initialize
来说,它的所有者是
Class
,但是对于它们的实例来说,
BasicObject

Class.instance_method(:initialize).owner
#=> Class

Class.new.instance_method(:initialize).owner
#=> BasicObject
混淆源于将
#initialize
显示为
::new
(这很方便,因为我们通常调用
new
,很少直接调用
initialize
)。因此,如果您打开的文档并单击“toogle source”,您将看到
Class\initialize
(或
rb\u Class\u initialize
的实现,如C中所称)

我所知道的唯一一个实际重写
new
类方法的类是
Struct
,即:

Struct.method(:new.owner)=>#
结构方法(:new).super#u方法#=>#
Class.instance_method(:initialize).owner
#=> Class

Class.new.instance_method(:initialize).owner
#=> BasicObject
Struct.method(:new).owner        #=> #<Class:Struct>
Struct.method(:new).super_method #=> #<Method: Class#new>