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

ruby – 解析与操作的可变范围和顺序:“if”中的赋值

发布时间:2020-12-17 04:00:55 所属栏目:百科 来源:网络整理
导读:我的理解是,行前面的if语句在行前面的代码之前进行了评估: 'never shown' if (false) 并且可以在if语句中进行赋值. 'shown' if (value = 'dave is king')value #= "dave is king" 并且,当分配不存在的变量时,将创建该变量.事先不需要它存在.这是真的? 如果
我的理解是,行前面的if语句在行前面的代码之前进行了评估:

'never shown' if (false)

并且可以在if语句中进行赋值.

'shown' if (value = 'dave is king')
value #=> "dave is king"

并且,当分配不存在的变量时,将创建该变量.事先不需要它存在.这是真的?

如果所有这些假设都成立,为什么会失败呢?

error_array << error if (error = import_value(value))
#=> undefined local variable or method `error' for

它在数组推右前分配给错误?我想了解什么时候进行评估.

这个确实有效:

if (error = import_value(value))
  error_array << error
end

现在我真的很困惑.

解决方法

它只会在您尝试分配文字值时发生,如果您调用它起作用的函数.

def foo(a)
  a
end

p 'not shown' if(value = foo(false))
p 'shown' if(value = foo(true))

# This outputs a Warning in IRB
p 'shown' if(value = false)
(irb):2: warning: found = in conditional,should be ==

如果打开调试(-d),您将看到有关已使用变量值的警告

warning: assigned but unused variable - value

这“有效”,因为语句确实评估为true,只要涉及到它,允许它前面的代码运行.

这里发生的是if()当用作修饰符时它有自己的绑定范围或上下文.因此,在if之外永远不会看到赋值,因此执行起来没有任何意义.这与控制结构不同,因为if语句所采用的块也与赋值在同一范围内,而if修饰符之前的行不在if的范围内.

换句话说,这些并不等同.

if a = some(value)
  puts a
end

puts a if(a = some(value))

前者已经将if放在if的范围内,后者将范围放在了范围之外,因此具有不同的绑定(ruby称之为上下文).

Ruby Order of Operations

(编辑:李大同)

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

    推荐文章
      热点阅读