加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Ruby中的变量范围

发布时间:2020-12-17 03:29:28 所属栏目:百科 来源:网络整理
导读:考虑以下两个 ruby代码片段. puts "One"if false d = 1endputs "Two"puts dputs "Three" 这将打印以下内容 OneTwoThree 现在,请考虑以下内容 [].each do |i| flag = falseendputs "Two"puts flagputs "Three" 这给出了以下内容 Two'main': undefined local v
考虑以下两个 ruby代码片段.

puts "One"
if false
  d = 1
end
puts "Two"
puts d
puts "Three"

这将打印以下内容

One
Two

Three

现在,请考虑以下内容

[].each do |i|
  flag = false
end
puts "Two"
puts flag
puts "Three"

这给出了以下内容

Two
'<main>': undefined local variable or method 'flag' for main:Object (NameError)

为什么在第一种情况下打印空白而第二种情况会抛出错误?

谢谢

解决方法

区别在于if块实际上不是像Java那样的其他语言中的单独范围.在if块中声明的变量与周围环境具有相同的范围.现在,在你的情况下,如果块实际上不会被执行,那么你通常期望d是未定义的(导致你在第二个例子中得到的相同错误).但ruby有点“smrt”,因为解释器会在它看到它的那一刻设置一个带有该标签的变量,无论它是否实际执行,因为它实际上还不知道该分支是否确实会执行.这是由David Flanagan和Yukihiro Matsumoto在 “The Ruby Programming Language”中解释的(不能复制粘贴文本,而是添加截图):

enter image description here

在.each循环的情况下,那个…你写的结尾实际上是block,它确实有自己的局部范围.换句话说,块内声明的变量只对该块是本地的.

但是,块“继承”它们声明的环境的范围,因此您可以做的是在.each迭代块之外声明标志,然后块将能够访问它并设置其值.请注意,在您给出的示例中,这不会发生,因为您尝试迭代空数组,但至少您不会再收到错误.

一些额外的阅读:

> Block variable scope in ruby
> Understanding scopes in ruby

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读