Class::new与Class#new是否为同一事物?Ruby类方法实例方法疑问
关于Ruby中Class#new的本质理解
你这个问题问到点子上了——Ruby里“类方法”和“实例方法”的边界在Class这个特殊类上确实容易绕晕,我来给你拆解清楚:
首先得打破一个常见误区:Ruby没有真正意义上的“类方法”,我们平时说的“类方法”,本质上是该类的**单例类(Singleton Class,也叫元类)**的实例方法。比如写def Class.foo; end,其实是在Class的单例类里新增了一个实例方法foo。
回到你的核心疑问:执行Class.new时,调用的到底是哪个方法?
答案是:你说的完全正确,这就是Class类的实例方法new,而非所谓的“类方法”。
原因很简单:在Ruby的对象模型里,所有类(包括Class本身)都是Class类的实例。比如:
Class.is_a?(Class) # => true String.is_a?(Class) # => true
既然Class是Class的实例,那它自然可以调用Class类定义的实例方法——而new正是Class类的实例方法!
那为什么我们平时会觉得String.new是“类方法”?因为String是Class的实例,它调用的也是Class的实例方法new,只是我们习惯把这种“由类对象直接调用的方法”叫做类方法,但本质上还是实例方法——是类对象(作为Class的实例)的实例方法。
再补个直观的佐证:你可以查看方法列表验证这一点:
# 检查Class的实例方法列表,能找到new Class.instance_methods.include?(:new) # => true # 检查Class的单例方法(即所谓“类方法”)列表,找不到new Class.singleton_methods.include?(:new) # => false
最后总结一下逻辑:
- 所有类(包括Class自身)都是Class的实例
new是Class类的实例方法,因此任何类对象都能调用它- 我们口中的“类方法new”,本质就是Class的实例方法被类对象(作为Class的实例)调用的结果
- 执行
Class.new时,就是Class这个实例在调用自己所属类(Class)的实例方法new,完全符合Ruby的对象模型逻辑
内容的提问来源于stack exchange,提问作者Baxter
相关产品推荐
相关产品推荐

