yandongdiy3300 2009-09-10 09:43
浏览 218
已采纳

ruby1.9是如何实现闭包内的循环变量(局部变量)x和外部同名变量x无关的?

ruby1.9是如何实现闭包内的局部变量x和外部同名变量x无关的?
x = 15

(1..5).each do |x|

puts x

end

puts x # -> 15

  • 写回答

1条回答 默认 最新

  • rednaxelafx 2009-09-10 12:15
    关注

    这个……不知道楼主要问的是语言本身的设计还是底下具体的实现。后者的话我觉得需要掌握一些编译相关的基础知识再去看会比较轻松些。

    前者的话,Ruby 1.9对block的作用域规则做了修改,使得block的参数中如果有跟外部环境的变量同名的,前者会在block内隐藏前者的作用域。楼主的例子就反映了这点。
    但观察这个情况:
    [code="irb"]irb(main):001:0> x = 15
    => 15
    irb(main):002:0> (1..5).each do |i|
    irb(main):003:1* puts x = i
    irb(main):004:1> end
    1
    2
    3
    4
    5
    => 1..5
    irb(main):005:0> x
    => 5[/code]
    像这样,在block里用了x,但x不是block的参数,而且在外部已经有x的定义,那么对x的改变照样会反映到外部。
    所以,为了保证一个变量的作用域局限在block内部,在Ruby 1.9中除了声明参数外,还可以声明局部变量:
    [code="irb"]irb(main):001:0> x = 15
    => 15
    irb(main):002:0> (1..5).each do |i;x|
    irb(main):003:1* puts x = i
    irb(main):004:1> end
    1
    2
    3
    4
    5
    => 1..5
    irb(main):005:0> x
    => 15[/code]
    在原本表示参数列表的两个竖线中,分号前面的是参数声明,分号后面的是局部变量声明。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题