我正试图在File
上调用方法。我阅读了File
的文档,我看到了课程method ::basename
。我尝试了以下方法:
x = File.new("name_of_file.ext")
x::basename("name_of_file.ext")
为什么我不能以这种方式访问类方法::basename
?
答案 0 :(得分:1)
Ruby中没有类方法。类是Ruby中任何其他对象的对象。与Ruby中的任何其他对象一样,它们是类的实例,即类Class
。
因此,就像任何其他对象具有在其类中定义的方法一样,类也具有在其类中定义的方法。
这是故事的一半。 "类方法"像::new
一样通常是这样的。 Class#new
是类Class
的实例方法,由于File
是Class
的实例,因此您可以调用File.new
。
故事的另一半是Ruby中的每个对象都有一个单例类,这个对象是该对象的唯一实例。由于此类只有一个实例,因此只能在该单个对象上调用此单例类中定义的任何实例方法。由于类是任何其他对象的对象,因此它们具有与任何其他对象一样的单例类,并且可以在那里定义方法。例如,File::basename
被定义为File
的单例类的实例方法。
您无法调用x.basename
的原因非常简单:File
和x
是完全不同的对象,这些对象是完全不同的类的实例,为什么会你希望能够在两者上调用相同的方法吗?好吧,你不会!作为不同类的实例的不同对象通常具有不同的方法。