2015-07-06 4 views
2

Я пытаюсь получить имя класса внутри статического метода в классе:рубин - получить имя класса из метода класса

class A 
    def self.get_class_name 
    self.class.name.underscore.capitalize.constantize 
    end 
end 

Хотя это возвращает класс вместо A. Любые мысли о том, как вместо этого я получаю А?

В конце концов, я также хочу иметь класс B, который наследует от A, который будет использовать тот же метод и будет возвращать B при вызове.

Причина, по которой я делаю это, потому что у меня есть другой объект в этом домене в конце концов: A::SomeOtherClass, который я хочу использовать, используя полученный результат.

+1

должен ли метод возвращает строку, то есть ' "А"'? – Stefan

+0

@Stefan, я думаю, он просто пытался понять, как получить текущее имя класса внутри метода класса. Это, наверное, просто пример. – ndn

+0

Вы хотите класс 'A' или имя (строка)' 'A?'? – sawa

ответ

4

Удалить .class:

class A 
    def self.get_class_name 
    self.name.underscore.capitalize.constantize 
    end 
end 

self в контексте класса (а не контексте метода экземпляра) относится к самому классу.

Именно поэтому вы пишете def self.get_class_name, чтобы определить метод класса. Это означает способ добавления get_class_name в self (aka A). Это эквивалентно def A.get_class_method.

Это также объясняет, почему, когда вы пытались self.class.name вы получили Class - Object#class из A является Class.

Чтобы сделать это более ясным, рассмотрим вывод:

class A 
    puts "Outside: #{self}" 

    def self.some_class_method 
    puts "Inside class method: #{self}" 
    end 

    def some_instance_method 
    puts "Inside instance method: #{self}" 
    end 
end 

A.some_class_method 
A.new.some_instance_method 

Который является:

Outside: A 
Inside class method: A 
Inside instance method: #<A:0x218c8b0> 
Смежные вопросы