我对Ruby中的作用域如何运作感到困惑。哪些Ruby作用域规则阻止以下代码打印出x的值?
#!/usr/bin/ruby
x = 5
def test
puts "x = #{x}"
end
test # => undefined local variable or method `x' for main:Object
等效的Python脚本会打印x:
的值#!/usr/bin/python
x = 5
def test():
print "x = %s" % x
test() # => x = 5
答案 0 :(得分:5)
这就是所谓的“范围门”。 ruby中有三个门:方法,类或模块的定义。意味着在该定义中,来自外部范围的本地化不可见。
这是因为当范围发生变化时,当前的一组绑定会被一组新的绑定所取代,并且无法轻易访问。
有关详细信息,请参阅“Metaprogramming Ruby: Program Like the Ruby Pros”。
答案 1 :(得分:3)
参见" Ruby classes, include, and scope"有关Ruby的范围和范围选通的更多信息。
有几种方法可以提供测试功能的可见性。一种是使变量成为实例变量:
#!/usr/bin/ruby
@x = 5
def test
puts "x = #{@x}"
end
另一个是使用带lambda的闭包:
#!/usr/bin/ruby
x = 5
test = lambda do
puts "x = #{x}"
end
test.call
或Proc.new()
#!/usr/bin/ruby
x = 5
test = Proc.new do
puts "x = #{x}"
end
test.call
对于lambda和Proc.new之间的差异,请参阅" When to use lambda, when to use Proc.new?"。