是否可以定义一个方法a?
,在true
存在时返回a
,并在未定义false
时返回a
?
以下代码不起作用,因为当defined? a
执行时,变量a
超出了其范围。
a = 123
def a?
if defined? a
return true
else
return false
end
end
puts a? # false
是否可以让我的代码的最后一行返回true
?
答案 0 :(得分:3)
不,这是不可能的。局部变量称为“局部变量”,因为它们是定义它们的范围的本地变量。它们按定义在其他范围内不存在。
你可以做什么,通过调用Binding
将本地范围重新作为Kernel#binding
对象,然后检查是否在Binding#local_variable_defined?
中定义了局部变量{1}}使用Python: Run function from the command line方法:
Binding
或者,更一般:
def a?(binding)
binding.local_variable_defined?(:a)
end
a?(binding)
# => false
a = 42 if false
a?(binding)
# => true
a
# => nil
答案 1 :(得分:0)
根据给定变量/对象的存在,定义自身返回nil或true。
您应该直接使用defined?
方法,而是使用其他方法:
if defined?a
puts "defined"
else
puts "not defined"
end
a = 10
if defined?a
puts "defined a: #{a}"
else
puts "not defined"
end
输出:
not defined
defined a: 10
答案 2 :(得分:-1)
在ruby中,关键字def
作为范围门,因此您将无法访问在方法定义之外定义的局部变量。或者,您可以使用块定义方法,从而允许您访问在方法定义之外定义的变量。
a = '123'
define_method 'a?' do
defined? a
end
有关此内容的更多信息,我强烈建议您阅读Metaprogramming Ruby的第一部分