В Ruby не существует метода класса. Классы являются объектами, как и любой другой объект в Ruby. Как и любой другой объект в Ruby, они являются экземплярами класса, а именно класса Class
.
Таким образом, как и у любого другого объекта, есть методы, определенные в его классе, классы также имеют методы, определенные в его классе.
Это одна половина истории. «Методы класса» типа ::new
обычно такие. Class#new
является методом экземпляра класса Class
, а поскольку File
является экземпляром Class
, вы можете вызвать File.new
.
Другая половина истории состоит в том, что у каждого объекта в Ruby есть одноэлементный класс , класс, единственным экземпляром которого является этот объект. Поскольку у этого класса есть только один экземпляр, любые методы экземпляра, определенные в этом одноэлементном классе, могут быть вызваны только для этого единственного объекта. Поскольку классы являются объектами, как и любой другой объект, они имеют одноэлементный класс, как и любой другой объект, и методы могут быть определены там. Например, File::basename
определен как метод экземпляра одноэлементного класса File
.
Причина, по которой вы не можете вызвать x.basename
, очень проста: File
и x
- это совершенно разные объекты, которые являются экземплярами совершенно разных классов, поэтому почему будет , вы ожидаете, что сможете вызывать один и тот же метод на обоих? Ну, ты бы не стал! Разные объекты, которые являются экземплярами разных классов, обычно имеют разные методы.