ruby 内联 while 与 while 结束

ruby inline while vs while end

为什么这样做:

a = [1, 2, 3]
while n = a.shift
  puts n
end

虽然这不是:

a = [1, 2, 3]
puts n while n = a.shift

只有我提前初始化n才有效:

a = [1, 2, 3]
n = nil
puts n while n = a.shift

也就是说,一般来说,解释器问题,不会出现在具有本地 variable bubbling 的语言中,例如 javascript。

解释器(从左到右阅读)在任何提及之前遇到右手操作数n

我越想越相信这是 ruby 解释器中的错误。正如@Cary 指出的那样,控制流程实际上是相同的:

a = [2, 3]
n = 1
puts n while n = a.shift
#⇒ 2
#⇒ 3

上面的输出中没有 1 的踪迹。

关于:puts n while n = a.shift

它会先 pares puts n,但是 n 在那个时候是未定义的。 Ruby 是动态类型语言;您没有显式声明变量类型,但您应该为变量赋值。

例如:

irb(main):027:0> xyz
NameError: undefined local variable or method `xyz' for main:Object
irb(main):028:0> xyz = 1
=> 1

n 在您尝试第一个 puts 时未定义。仅在评估 puts 之后才检查条件和相应的 shift按您预期工作的替代方案是

a = [1, 2, 3]
puts a.shift while a.length > 0