检查局部变量是否定义为给定的';在ruby中,s名称作为字符串

检查局部变量是否定义为给定的';在ruby中,s名称作为字符串,ruby,reflection,Ruby,Reflection,如果局部变量的名称为字符串,我是否可以检查它是否已定义 我知道有定义的函数,,但必须给出变量本身 例如: a = 'cat' print defined?(a) # => "cat" print defined?(b) # => nil 我需要的是: a = 'cat' print string_defined?("a") # => "cat" print string_defined?("b") # => nil 或者类似的。我在文件里找不到 我尝试使用响应?,但似

如果局部变量的名称为字符串,我是否可以检查它是否已定义

我知道有定义的函数
,但必须给出变量本身

例如:

a = 'cat'
print defined?(a) # => "cat"
print defined?(b) # => nil
我需要的是:

a = 'cat'
print string_defined?("a") # => "cat"
print string_defined?("b") # => nil
或者类似的。我在文件里找不到

我尝试使用
响应?
,但似乎不起作用…

您可以使用以下方法:


免责声明:此答案使用了
eval
,因此如果您不严格控制要传递到其中的字符串,则可能会很危险。如果这些字符串来自用户输入,您肯定不应该这样做。

当所讨论的局部变量在上下文中定义时,下面将返回
true
,而不必在其点之前的位置:

local_variables.include?("a".to_sym)
#=> true

从Ruby 2.1.0开始,您可以使用:


@AndreyDeineko,因为我想做一些类似的事情:
list_of_strings.reject{s|!string_defined?(s)}
,使用
list_of_strings
参数。请注意,即使在查询之后定义了
a
,所有当前答案都返回
true
。您的答案是正确的(第一次投票来自我),但要准备好让愚蠢的用户开始对你投反对票。这是非常聪明的。这将完全符合我的要求,因为它使用原始的
defined?
方法。因此
local\u variables
包含范围中定义的变量的所有符号名的列表?@EricDuminil“这不等同于defined?”--对。这与问题有什么关系?@EricDuminil问题没有提到时间。返回是否将在该上下文中定义它是对该问题的一种解释。不要强行解释。@EricDuminil其他两个(未删除的)答案的情况相同。你为什么特别针对这个答案?
local_variables.include?("a".to_sym)
#=> true
a = 'cat'
binding.local_variable_defined? 'a' #=> true
binding.local_variable_defined? 'b' #=> false