【发布时间】:2014-09-13 01:58:43
【问题描述】:
在以下 Ruby 代码中,
#! /usr/bin/env ruby
x = true
y = x and z = y
puts "z: #{z}"
它将按预期输出z: true。
但在以下一个中,我希望具有相同的行为:
#! /usr/bin/env ruby
x = true
z = y if y = x
puts "z: #{z}"
结果
main:Object (NameError) 的未定义局部变量或方法“y”
这是为什么呢?
我明白我正在做一个赋值,并隐式检查赋值值以确定是否运行z = y。我也明白,如果我在x = 5 行之后添加y 的声明y = nil,它将按预期通过并运行。
但是,期望语言首先评估 if 部分,然后评估其内容,第二块代码的行为与第一块代码相同,这难道不正确吗?
【问题讨论】:
-
这是一个非常好的问题,因为
z = 2 if y = x可以正常工作,z = w if false也可以... -
这是 Ruby 的愚蠢领域之一。有一些定义不明确的子句相当于“如果解析器遇到分配”(意味着分配确实 not 必须执行以创建本地绑定).. 除非它在某些情况下崩溃像这样,还有其他几个。参考。 stackoverflow.com/questions/25783428/…
-
@MarcBaumbach 这不是“错误”。这是“预期的行为”,即使不是真的......预期的。
-
我认为那些导致
x=x不是NameError的小鬼也有自己的爪子。 -
@roippi
x=x不是错误,因为分配x =在调用x之前。
标签: ruby