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>