为什么我不能在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/

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...