Ruby - 如何在给定实例变量的情况下查找类名?

时间:2015-06-11 15:57:41

标签: ruby reflection introspection

如何根据实例变量找到类名?例如,给出以下类:

class Student
  attr_accessor :name
end

,以下对象:

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

如何从Class对象的实例变量name获取类名(或其student对象)?

4 个答案:

答案 0 :(得分:2)

是的,你可以!

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 #=> [] 

答案 1 :(得分:0)

你不能,你可以得到一个实例变量的类名,但是“实例的实例变量”有自己的类(它仍然是一个对象)。

因此student.name.class将返回Stringstudent.class将返回Student

如果您想要这样的绑定(学生姓名=>学生班级),您必须编写自己的系统来跟踪它。但无论如何,你的系统不能阻止任何人在任何地方写“John Doe”并声称它是Student对象的实例变量。

目前我所知道的编程语言并没有提供您所要求的功能。

也许你想要像student.name = StudentName.new("John Doe")这样的东西?在这种情况下,您绝对可以跟踪它,但是由您创建并使其有效。

答案 2 :(得分:0)

您可以将学生作为值放在哈希中,其名称为关键:

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会践踏旧的名字。

答案 3 :(得分:-1)

在实例上调用类应该为您提供类对象。

student.class
# => Student