2015-06-11 7 views
0

Как найти имя класса с учетом его переменных экземпляра? Например, если класс ниже:Ruby - Как найти имя класса с учетом переменной экземпляра?

class Student 
    attr_accessor :name 
end 

и объект ниже:

student = Student.new 
student.name = "John Doe" 

Как я могу получить имя класса (или его Class объекта) из экземпляра переменной name от student объекта ?

+2

Вы имеете в виду, если у вас есть 'name = student.name', и вы хотите получить' Student' из переменной 'name'? Если это так, вы не можете. В этом пункте 'name' является только нормальной строкой. –

+0

Справа. Это верно для любого типа объекта? Я имею в виду, что если бы вместо строки у меня был произвольный объект, такой как student.personality, где личность была экземпляром другого класса под названием Personality. – exbuddha

+0

Egad! Вы задали этот вопрос всего 19 минут назад, и вы уже выбрали ответ? Почему спешка? –

ответ

0

Вы не можете, вы можете получить имя класса переменной экземпляра, но «экземпляр переменной экземпляра» имеет свой собственный класс (он все еще объект).

Так student.name.class вернется String, student.class вернет Student.

Если вам нужна такая привязка (студенческое имя => класс ученика), вы должны написать свою собственную систему, чтобы отслеживать ее. Но в любом случае ваша система не может запретить кому-либо писать «John Doe» где угодно и требовать ее переменную экземпляра для объекта Student.

Отсутствует язык программирования, который в настоящее время я знаю, предоставляет функцию как запрошенную.

Возможно, вы хотите что-то вроде student.name = StudentName.new("John Doe")? В этом случае вы можете определенно отслеживать это, но это зависит от вас, чтобы создать его и заставить его работать.

+0

Получил это. Благодарю. – exbuddha

+0

Из этого не следует, потому что (значение) переменной экземпляра имеет свой «собственный класс», вы не можете получить класс (или классы), у которого есть переменные экземпляра этим именем. –

+0

Этого не нужно. Я полагаю, что точка в первом утверждении заключалась в том, чтобы показать, что «можно» сделать, а не прийти к логическому последствию того, что одно действие не может быть сделано, потому что можно сделать другое действие. Его комментарий по-прежнему действителен. Языки программирования, похоже, не заботятся о том, чтобы отслеживать или подвергать иерархию классов объектам, или я не знаю об этом. Те, которые поддерживают интроспекцию, предоставляют способы поиска класса типа объекта, но не класса его владельца. – exbuddha

-1

вызывающий класс в экземпляре должен предоставить объект класса.

student.class 
# => Student 
+0

Правильно, но это не то, что я ищу.Я хочу найти класс из student.name вместо самого студента. – exbuddha

1

Да, вы можете!

def owner(iv) 
    ObjectSpace.each_object(Class).select { |c| c.instance_variables.include?(iv) } 
end 

class A 
    @a = 1 
end 

class B 
    @b = 2 
end 

class C 
    @a = 3 
end 

owner :@a #=> [C, A] 
owner :@b #=> [B] 
owner :@C#=> [] 
+0

Аккуратная находка в ObjectSpace. Как бы вы различали C и A в своем первом примере? – exbuddha

+0

Все, что можно сказать, состоит в том, что классы 'A' и' C' имеют переменные экземпляра с именем ': @ a', и они являются единственными классами, которые делают. –

0

Вы можете поместить своих студентов в качестве значения в Hash, с их именами, как ключ:

class Student 
    attr_accessor :name 
end 

student = Student.new 
student.name = "John Doe" 

students_by_name = {} 
students_by_name[student.name] = student 
p students_by_name["John Doe"] 
# => #<Student:0x00000000baf770 @name="John Doe"> 

Но эти имена студентов лучше быть уникальным - новая John Doe будет попирать старый.