按照我们一般的思维模式,特别是在大量使用了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
确实已经恢复到期望输出了。
再次感谢。
分享到:
- 2008-11-29 22:55
- 浏览 1077
- 评论(2)
- 论坛回复 / 浏览 (2 / 2608)
- 查看更多
相关推荐
Ruby中不具备嵌套作用域(即在内部作用域,可以看到外部作用域的)的特点,它的作用域是截然分开的,一旦进入一个新的作用域,原先的绑定会被替换为一组新的绑定。 程序会在三个地方关闭前一个作用域,同时打开一个新...
类变量、全局变量、实例变量, 多态、为什么ruby、ruby编码规范
Ruby中的变量有几种形式,分别是局部变量、实例变量、类变量、全局变量,对于初学者来说,常常容易搞混,尤其像本人这种做java的,理解起来还是头痛,经过仔细辨别学习,将这几种变量的差异及使用场景总结如下: ...
Ruby语言教程:Ruby 变量示例
主要介绍了Ruby中类变量和实例变量的比较,本文讲解了4点类变量和实例变量的不同之处,并给出了代码实例,需要的朋友可以参考下
ruby> $foo nil ruby> $foo = 5 5 ruby> $foo 5 应谨慎使用全局变量.由于在任何地方都可以被写因此他们相当危险.滥用全局变量会导致很难隔离臭虫;同时也视为程序的设计未经严格考虑.当你发现必须要使用全局...
对block的一种更简单的描述是“一个block就是一段存储在一个变量中的代码,它和其他的对象一样,可以被随时的运行” 然后,咱们通过看一些代码,之后再把这些代码重构成Ruby中的block形式。通过代码来实际的感受,...
1. 什么是Ruby?简要介绍Ruby的特点和主要用途。 2. Ruby中的变量声明和赋值规则是什么?请说明Ruby变量声明和赋值的语法。 3. Ruby中常用的数据类型有哪些?请列举几种常见的Ruby数据类型...请说明在Ruby中符号的作用
主要介绍了深入讲解Ruby中Block代码快的用法,block是Ruby学习进阶当中的重要知识,需要的朋友可以参考下
块变量:以yield关键字调用block也可以传递参数,block中竖线(|)之间给出的参数名用于接收来自yield的参数。 竖线之间(如上例中的 | i |)的变量被称作块变量,作用和一个正常方法的参数一样 2、掌握代码块的编写 ...
主要介绍了Ruby中Block和迭代器的使用,是Ruby入门学习中的基础知识,需要的朋友可以参考下
主要介绍了Ruby中变量引用时的一些注意点,被当作变量或被当作方法调用的情况,需要的朋友可以参考下
主要介绍了Ruby中的block、proc、lambda区别总结,本文讲解了yield 和 block call 的区别、block 和 proc、lambda 的区别、proc 和 lambda 的区别,需要的朋友可以参考下
Ruby 环境变量 Ruby 解释器使用下列环境变量来控制它的行为。ENV 对象包含了所有当前设置的环境变量列表。 对于 Unix,使用 env 命令来查看所有环境变量的列表。 HOSTNAME=ip-72-167-112-17.ip.secureserver.net ...
Ruby中文文档.CHM 方便ruby or rails学习.
ruby中文教程,从基础到深入的让你学习ruby
ruby中英文api 适合于初学者。 希望能给大家带来一些帮助