Метод класса Ruby и метод экземпляра - PullRequest
0 голосов
/ 17 мая 2018

Я пытаюсь вызвать метод на File. Я читаю документацию File и вижу класс method ::basename. Я попробовал следующее:

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

Почему я не могу получить доступ к методу класса ::basename таким образом?

1 Ответ

0 голосов
/ 17 мая 2018

В Ruby не существует метода класса. Классы являются объектами, как и любой другой объект в Ruby. Как и любой другой объект в Ruby, они являются экземплярами класса, а именно класса Class.

Таким образом, как и у любого другого объекта, есть методы, определенные в его классе, классы также имеют методы, определенные в его классе.

Это одна половина истории. «Методы класса» типа ::new обычно такие. Class#new является методом экземпляра класса Class, а поскольку File является экземпляром Class, вы можете вызвать File.new.

Другая половина истории состоит в том, что у каждого объекта в Ruby есть одноэлементный класс , класс, единственным экземпляром которого является этот объект. Поскольку у этого класса есть только один экземпляр, любые методы экземпляра, определенные в этом одноэлементном классе, могут быть вызваны только для этого единственного объекта. Поскольку классы являются объектами, как и любой другой объект, они имеют одноэлементный класс, как и любой другой объект, и методы могут быть определены там. Например, File::basename определен как метод экземпляра одноэлементного класса File.

Причина, по которой вы не можете вызвать x.basename, очень проста: File и x - это совершенно разные объекты, которые являются экземплярами совершенно разных классов, поэтому почему будет , вы ожидаете, что сможете вызывать один и тот же метод на обоих? Ну, ты бы не стал! Разные объекты, которые являются экземплярами разных классов, обычно имеют разные методы.

...