为什么这个类似python的ruby脚本不起作用?

时间:2012-07-23 21:24:09

标签: python ruby scope

我对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

2 个答案:

答案 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?"。