我有一个名为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/