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 会践踏旧的。
如何在给定实例变量的情况下找到 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 会践踏旧的。