Метод для получения имени класса (на самом деле модуля) - это просто Module#name
. Там нет необходимости писать свои собственные:
Parent.name # => 'Parent'
Child.name # => 'Child'
Однако в Ruby действительно не существует такой вещи, как «имя класса», как в некоторых других языках. В Ruby класс - это просто объект, похожий на любой другой объект, который назначается переменной, как и любая другая переменная.
Все, что делает метод Module#name
, это перебирает все константы в системе и проверяет, назначен ли модуль какой-либо из них, и возвращает имя этой константы или nil
, если он не может их найти.
Таким образом, как и любой другой объект, «имя» класса - это на самом деле ничего, кроме любой переменной, которую вы используете для ссылки на него.
Пример:
foo = Class.new
foo.name # => nil
Теперь «имя» класса - foo
. Однако Module#name
возвращает nil
, поскольку foo
не является константой.
bar = foo
bar.name # => nil
Теперь «имя» класса равно и foo
и bar
, но Module#name
, очевидно, все еще возвращает nil
.
BAZ = foo
foo.name # => 'BAZ'
Теперь, поскольку класс был присвоен константе, имя этой константы будет считаться именем этого класса & hellip;
BAZ = nil
foo.name # => 'BAZ'
* * & Одна тысяча тридцать восемь hellip; даже после того, как константа была присвоена чему-то другому и & hellip;
QUX = foo
QUX.name # => 'BAZ'
& hellip; даже после присвоения классу другой константы.
Module#to_s
использует Module#name
, если это не nil
, поэтому, чтобы напечатать имя класса, вы просто делаете
puts Parent
На самом деле абсолютно нет необходимости во всех сложных пухах в других ответах.