如何根据实例变量找到类名?例如,给出以下类:
class Student
attr_accessor :name
end
,以下对象:
student = Student.new
student.name = "John Doe"
如何从Class
对象的实例变量name
获取类名(或其student
对象)?
答案 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
将返回String
,student.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