是否可以调用定义?在动态实例变量名称?

时间:2014-10-13 16:12:30

标签: ruby

有没有办法在动态实例变量名称上调用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}}相同的语义定义{但是以动态方式?

2 个答案:

答案 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转换参数,以便将苹果与苹果进行比较。