ruby 当你有一个代表示例变量的符号时,你如何检查一个示例变量是否被设置了?

cbwuti44  于 2023-08-04  发布在  Ruby
关注(0)|答案(1)|浏览(102)

我想使用remove_instance_variable(instance_variable),其中instance_variable包含一个形式为:@some_variable的符号,但首先我想验证示例变量(例如:@some_variable存在。
defined? instance_variable当然会返回“local-variable”,所以这对我没有好处。
即使我可以获取instance_variable的内容,为了有效地使用defined? :@some_variable,它也会返回“expression”,因为它告诉我符号已经定义了。(所有符号,即使是您以前从未使用过的符号,在此上下文中也将返回“expression”。
如果我使用eval,那么这个符号可以方便地被实际的示例变量替换,它可以工作,返回nil或“instance-variable”。

eval("defined? #{instance_variable}")

字符串

  • 但是 * 考虑到对eval的强烈厌恶(当然,在变量可能包含用户提交的值的情况下,这是合理的),如果可能的话,我宁愿找到一个不同的解决方案。即使我完全确保instance_variable不可能包含任何用户提交的数据,在我之后查看代码的每个人都会停下来问“为什么这里使用eval?“.

是否有其他方法来检查instance_variable中的符号引用的示例变量是否已定义?

bejyjqdl

bejyjqdl1#

Object实现了获取、设置、检查、列出和删除示例变量的5种方法:

  • Object#instance_variable_get-返回示例变量的值
  • Object#instance_variable_set-设置示例变量的值
  • Object#instance_variable_defined?-检查是否定义了示例变量
  • Object#instance_variables-返回所有示例变量名的数组
  • Object#remove_instance_variable-删除示例变量

instance_variable_defined?是您正在寻找的:

name = :@foo
instance_variable_defined?(name) #=> false

@foo = nil
instance_variable_defined?(name) #=> true

字符串
该方法也适用于实现可能是nil的值的记忆:

def foo
  return @foo if instance_variable_defined?(:@foo)
  
  @foo = expensive_operation_that_could_return_nil
end

相关问题