有没有办法在动态实例变量名称上调用check defined?
?我想要的是能够做这样的事情:
dynamic_attr = 'foo'
define_method :my_method do
if defined? instance_variable_get("@#{dynamic_attr}") # Obviously fails, but you see what I'm getting at...
....
end
end
当然这会失败,因为defined?
是一种查看文字的特殊形式,因此在这种情况下会返回"method"
,因为它会查看实际的instance_variable_get
方法。当然,instance_variable_get("@foo")
如果我曾致电nil
,那么@foo = nil
将会返回@foo
,因此它与以前没有设置无法区分。有没有什么办法可以看出,defined?
是否使用与{{1}}相同的语义定义{但是以动态方式?
答案 0 :(得分:3)
奇怪的是没有人提到这一点。还有Object#instance_variable_defined?
。
dynamic_attr = 'foo'
define_method :my_method do
if instance_variable_defined?("@#{dynamic_attr}")
....
end
end
答案 1 :(得分:2)
如果我确实得到了您的问题,您需要检查是否定义了实例变量。 Object#instance_variable_get
检索现有变量的值,如果不存在则检索nil
,而不是实例变量名称。
您可以通过其成员资格检查动态创建的变量名称的定义,例如:
dynamic_attr = 'foo'
define_method :my_method do
if instance_variables.member? "@#{dynamic_attr}".to_sym
....
end
end
请参阅返回的带有Object#instance_variables
的数组包含符号,因此您需要使用String#to_sym
转换参数,以便将苹果与苹果进行比较。