ruby - 解析与操作的可变范围和顺序 : Assignment in an "if"

标签 ruby variable-assignment conditional-statements

我的理解是,行尾的 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

数组push前赋值错误对吧?我想了解何时评估事物。

这个确实有效:

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),您将看到有关已使用变量 value 的警告

warning: assigned but unused variable - value

这个“有效”是因为就 if 而言,该语句的计算结果确实为 true,从而允许它之前的代码运行。

这里发生的事情是当 if() 用作修饰符时有它自己的绑定(bind)范围或上下文。所以赋值永远不会在 if 之外出现,因此执行起来毫无意义。这与 if 控制结构不同,因为 if 语句采用的 block 也在与赋值相同的范围内,而 if 修饰符之前的行不在 if 的范围内。

换句话说,它们不是等价的。

if a = some(value)
  puts a
end

puts a if(a = some(value))

前者在 if 范围内有 puts a,后者在范围外有 puts a,因此具有不同的绑定(bind)(ruby 称之为上下文)。

Ruby Order of Operations

关于ruby - 解析与操作的可变范围和顺序 : Assignment in an "if",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15102804/

相关文章:

ruby - 在 ruby​​ 中创建文件数组并按日期排序

css ->=Rails 3.1 如何在 Assets 管道中包含 IE 特定的 YAML-CSS 文件

java - 比较字符串的不同方法

php - 使用 SoundCloud API 取消关注

ruby - 使用 MongoDB 进行分页

ruby - 传递方法来减少/注入(inject)而不是阻塞

c++:按成员分配是如何工作的?

c# - 在表达式中使用赋值可以吗?

c# - 为什么局部变量在一种方法中赋值,但在几乎相同的方法中未赋值?

java - for 循环内的条件问题 (JAVA)