Ruby类方法和实例方法

时间:2018-05-17 00:00:54

标签: ruby class methods instance

我正试图在File上调用方法。我阅读了File的文档,我看到了课程method ::basename。我尝试了以下方法:

x = File.new("name_of_file.ext")
x::basename("name_of_file.ext")

为什么我不能以这种方式访问​​类方法::basename

1 个答案:

答案 0 :(得分:1)

Ruby中没有类方法。类是Ruby中任何其他对象的对象。与Ruby中的任何其他对象一样,它们是类的实例,即类Class

因此,就像任何其他对象具有在其类中定义的方法一样,类也具有在其类中定义的方法。

这是故事的一半。 "类方法"像::new一样通常是这样的。 Class#new是类Class的实例方法,由于FileClass的实例,因此您可以调用File.new

故事的另一半是Ruby中的每个对象都有一个单例类,这个对象是该对象的唯一实例。由于此类只有一个实例,因此只能在该单个对象上调用此单例类中定义的任何实例方法。由于类是任何其他对象的对象,因此它们具有与任何其他对象一样的单例类,并且可以在那里定义方法。例如,File::basename被定义为File的单例类的实例方法。

您无法调用x.basename的原因非常简单:Filex是完全不同的对象,这些对象是完全不同的类的实例,为什么你希望能够在两者上调用相同的方法吗?好吧,你不会!作为不同类的实例的不同对象通常具有不同的方法。