Ruby - 如何找到给定实例变量的 class 名称?

Ruby - How to find class name given an instance variable?

如何在给定实例变量的情况下找到 class 名称?例如,给定下面的 class:

class Student
  attr_accessor :name
end

以及下面的对象:

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

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

在一个实例上调用 class 应该会给你 class 对象。

student.class
# => Student

你不能,你可以得到一个实例变量的class名称,但是"instance variable of an instance"有它自己的class(它仍然是一个对象)。

所以student.name.class会returnString,student.class会returnStudent.

如果你想要这样的绑定 (student name => student class) 你必须编写自己的系统来跟踪它。但无论如何,你的系统不能阻止任何人在任何地方写 "John Doe" 并声明它是 Student 对象的实例变量。

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

也许您想要 student.name = StudentName.new("John Doe") 之类的东西?在这种情况下,您绝对可以跟踪它,但这取决于您创建它并让它发挥作用。

是的,你可以!

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

您可以将您的学生作为值放入哈希中,以他们的名字作为键:

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