`

Ruby中的block与变量作用域

阅读更多

按照我们一般的思维模式,特别是在大量使用了Java等高级强静态语言后,可能对变量作用域有很好的理解。

但是在Ruby中,我们会发现一些不同往常经验的例子。

系统环境 写道
ruby 1.8.6 (2007-09-24 patchlevel 111) [i486-linux]
 

请看这个例子:

#test the block

verb='rescued'
['sedated', 'powdered', 'electrocuted'].
each do |verb|
  puts 'Dr. Cham ' + verb + ' his niece Hannah.'
end
puts 'Yes, Dr. Cham ' + verb + ' his niece Hannah.'
if true then
  verb = 'In the if'
end
puts 'After the if-then-end statement ' + verb

 首先我们不运行,来人为想像一下这个的输出,深深都到Java影响的话可能会得到这样一个结果:

猜想的结果 写道
Dr. Cham sedated his niece Hannah.
Dr. Cham powdered his niece Hannah.
Dr. Cham electrocuted his niece Hannah.
Yes, Dr. Cham rescued his niece Hannah.
After the if-then-end statement In the if

 那么让我们来运行一下看看真实的情况:

真实输出 写道
Dr. Cham sedated his niece Hannah.
Dr. Cham powdered his niece Hannah.
Dr. Cham electrocuted his niece Hannah.
Yes, Dr. Cham electrocuted his niece Hannah.
After the if-then-end statement In the if

 很奇怪吧,从感觉上,虽然我们在各个block中定义了局部变量,但是从表现上来看始终就一个变量在工作。其实也不是,看看这个例子的简单变形(就去掉了第一行的代码):

#test the block

#verb='rescued'
['sedated', 'powdered', 'electrocuted'].
each do |verb|
  puts 'Dr. Cham ' + verb + ' his niece Hannah.'
end
puts 'Yes, Dr. Cham ' + verb + ' his niece Hannah.'
if true then
  verb = 'In the if'
end
puts 'After the if-then-end statement ' + verb

 输出发生了变化:

输出结果 写道
Dr. Cham sedated his niece Hannah.
Dr. Cham powdered his niece Hannah.
Dr. Cham electrocuted his niece Hannah.
testblock.rb:8: undefined local variable or method `verb' for main:Object (NameError)

 也就是说,那个block还是起了一些作用的。

也就是说,如果block意识到verb已经存在,然后就直接使用了。

小结:

  • 变量仍然有生存周期
  • block块 会去使用已经存在的同名的变量

 

有机会,我会好好研究下《Ruby Hacking Guide》,认真分析一下原因的。

谢谢各位朋友的提示,今天我将ruby升级到了1.9版。

ubuntu apt-get 写道
sudo apt-get install ruby1.9 irb1.9 rdoc1.9

 现在的系统环境

系统环境 写道
ruby 1.9.0 (2007-12-25 revision 14709) [i486-linux]

 现在重新运行一下看看结果:

运行结果 写道
Dr. Cham sedated his niece Hannah.
Dr. Cham powdered his niece Hannah.
Dr. Cham electrocuted his niece Hannah.
Yes, Dr. Cham rescued his niece Hannah.
After the if-then-end statement In the if

 确实已经恢复到期望输出了。

再次感谢。

分享到:
评论
2 楼 Jan 2008-11-30  
根本就是1.8的bug,楼主不用研究了。。。
1 楼 nan1nan1 2008-11-29  
matz承认这是ruby设计上的失误,1.9就不这样了。

相关推荐

    简要解读Ruby面向对象编程中的作用域

    Ruby中不具备嵌套作用域(即在内部作用域,可以看到外部作用域的)的特点,它的作用域是截然分开的,一旦进入一个新的作用域,原先的绑定会被替换为一组新的绑定。 程序会在三个地方关闭前一个作用域,同时打开一个新...

    类变量、全局变量、实例变量, 多态、为什么ruby、ruby编码规范

    类变量、全局变量、实例变量, 多态、为什么ruby、ruby编码规范

    Ruby中的变量学习总结

    Ruby中的变量有几种形式,分别是局部变量、实例变量、类变量、全局变量,对于初学者来说,常常容易搞混,尤其像本人这种做java的,理解起来还是头痛,经过仔细辨别学习,将这几种变量的差异及使用场景总结如下: ...

    Ruby语言教程:Ruby 变量示例

    Ruby语言教程:Ruby 变量示例

    Ruby中类变量和实例变量的比较

    主要介绍了Ruby中类变量和实例变量的比较,本文讲解了4点类变量和实例变量的不同之处,并给出了代码实例,需要的朋友可以参考下

    解析 ruby 全局变量

    ruby> $foo nil ruby> $foo = 5 5 ruby> $foo 5 应谨慎使用全局变量.由于在任何地方都可以被写因此他们相当危险.滥用全局变量会导致很难隔离臭虫;同时也视为程序的设计未经严格考虑.当你发现必须要使用全局...

    深入理解Ruby中的代码块block特性

    对block的一种更简单的描述是“一个block就是一段存储在一个变量中的代码,它和其他的对象一样,可以被随时的运行” 然后,咱们通过看一些代码,之后再把这些代码重构成Ruby中的block形式。通过代码来实际的感受,...

    Ruby常见面试题.pdf

    1. 什么是Ruby?简要介绍Ruby的特点和主要用途。 2. Ruby中的变量声明和赋值规则是什么?请说明Ruby变量声明和赋值的语法。 3. Ruby中常用的数据类型有哪些?请列举几种常见的Ruby数据类型...请说明在Ruby中符号的作用

    深入讲解Ruby中Block代码快的用法

    主要介绍了深入讲解Ruby中Block代码快的用法,block是Ruby学习进阶当中的重要知识,需要的朋友可以参考下

    Ruby中的block代码块学习教程

    块变量:以yield关键字调用block也可以传递参数,block中竖线(|)之间给出的参数名用于接收来自yield的参数。  竖线之间(如上例中的 | i |)的变量被称作块变量,作用和一个正常方法的参数一样 2、掌握代码块的编写 ...

    Ruby中Block和迭代器的使用讲解

    主要介绍了Ruby中Block和迭代器的使用,是Ruby入门学习中的基础知识,需要的朋友可以参考下

    Ruby中变量引用时的一些注意点

    主要介绍了Ruby中变量引用时的一些注意点,被当作变量或被当作方法调用的情况,需要的朋友可以参考下

    Ruby中的block、proc、lambda区别总结

    主要介绍了Ruby中的block、proc、lambda区别总结,本文讲解了yield 和 block call 的区别、block 和 proc、lambda 的区别、proc 和 lambda 的区别,需要的朋友可以参考下

    Ruby基本的环境变量设置以及常用解释器命令介绍

    Ruby 环境变量 Ruby 解释器使用下列环境变量来控制它的行为。ENV 对象包含了所有当前设置的环境变量列表。 对于 Unix,使用 env 命令来查看所有环境变量的列表。 HOSTNAME=ip-72-167-112-17.ip.secureserver.net ...

    Ruby中文帮助文档

    Ruby中文文档.CHM 方便ruby or rails学习.

    ruby中文教程,从基础到深入的让你学习ruby

    ruby中文教程,从基础到深入的让你学习ruby

    ruby中英文api

    ruby中英文api 适合于初学者。 希望能给大家带来一些帮助

Global site tag (gtag.js) - Google Analytics