为什么我不能在Ruby中的方法中访问局部变量?

前端之家收集整理的这篇文章主要介绍了为什么我不能在Ruby中的方法中访问局部变量?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个名为test.rb的Ruby文件
ff="ff"
def test
  puts ff
end

我执行它,得到错误

test.rb:3:在`test’中:未定义的局部变量或方法`ff’for main:Object(NameError)

这是什么原因?有没有文件可以解释它?

解决方法

在测试方法定义中ff无法访问的原因很简单,方法(使用def关键字创建)创建了一个新范围.与分别使用类和模块关键字定义类和模块相同.

main(顶级对象)的角色几乎完全与这种情况下的范围问题无关.

请注意,如果您希望测试方法可以访问定义上下文中定义的locals,那么请使用define_method(或者在您的情况下,使用define_singleton_method方法),请参阅此处:

ff = "hi"
define_singleton_method("test") { ff }
test #=> "hi"

与def关键字不同,define_method方法系列不会创建新范围,而是关闭当前范围,捕获任何局部变量.

在@soup给出的下一个例子中使用@ff的原因并不是主要在某种程度上是一个“特殊情况”,只是在顶层定义的ivar是一个主要的ivar,因此可以访问调用方法主要.

然而,测试方法与主要的关系是什么?它不仅仅是main本身的方法 – 它实际上是在Object类上定义的私有实例方法.这意味着测试方法几乎可用于ruby程序中的每个对象(作为私有方法).在顶级(main)定义的所有方法实际上都定义为Object类上的私有实例方法.

有关Ruby顶级的更多信息,请参阅此文章http://banisterfiend.wordpress.com/2010/11/23/what-is-the-ruby-top-level/

猜你在找的Ruby相关文章