4

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

2 回答 2

5

这就是所谓的“范围门”。ruby 中有三个门:方法、类或模块的定义。这意味着在该定义内部,来自外部范围的本地人是不可见的。

之所以如此,是因为当范围发生变化时,当前的绑定集会被一组新的绑定替换,并且无法轻松访问。

有关更多信息,请参阅“元编程 Ruby:像 Ruby 专家一样编程”。

于 2012-07-23T21:26:12.307 回答
3

有关 Ruby 的作用域和作用域门控的更多信息,请参阅“ 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 的区别,请参见“何时使用 lambda,何时使用 Proc.new? ”。

于 2012-07-23T21:35:31.530 回答