代码未在默认参数值规范中评估

时间:2014-12-27 04:50:51

标签: ruby local-variables lexical-scope

(至少某种类型)Ruby代码在方法的默认值规范中被接受和评估。在下面,评估"foo" * 3

def bar baz = "foo" * 3; baz end
bar # => "foofoofoo"

def bar baz: "foo" * 3; baz end
bar # => "foofoofoo"

但是,当我尝试在默认值描述中的某个范围内评估局部变量/方法时,如下所示,在词法范围内评估局部变量/方法:

MAIN = TOPLEVEL_BINDING.eval('self')
foo = 3

def bar baz = MAIN.instance_eval{foo}; end
bar # => undefined local variable or method `foo' for main:Object

def bar baz: MAIN.instance_eval{foo}; end
bar # => undefined local variable or method `foo' for main:Object
  • 为什么上面的foo未在MAIN范围内进行评估并在词汇范围内进行评估?
  • 这似乎在默认值描述中可以评估Ruby表达式有一些限制。到底能放到什么地方?

1 个答案:

答案 0 :(得分:1)

foomain的本地变量。您尝试从外部访问本地变量可能会缩短为:

▶ MAIN = TOPLEVEL_BINDING.eval('self')
▶ foo = 3
▶ MAIN.foo
#⇒ NoMethodError: undefined method `foo' for main:Object

这种代码的模拟方式不那么纠结:

class A
  foo = 5
end

class B
  def a_foo
    A.new.foo
  end
end

▶ B.new.a_foo
#⇒ NoMethodError: undefined method `foo' for #<A:0x00000002293bd0>

如果您想提供从Universe到本地变量的访问权限,那么您将实现 getter

def MAIN.foo ; 5 ; end
def bar baz = MAIN.instance_eval{foo}; baz; end

▶ bar
#⇒ 5

希望它有所帮助。