定义检查变量是否存在的方法

时间:2016-08-17 09:46:15

标签: ruby

是否可以定义一个方法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

3 个答案:

答案 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的第一部分