ruby内联while vs while end

ruby内联while vs while end,ruby,while-loop,inline,Ruby,While Loop,Inline,为什么这样做有效: 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 一般来说,这是一个解释器问题,在使用本地语言(如javascript)的语言中无法出现 解释器(从左到右读取)在提到右操作数之前遇到右操作数n 我越想它,就越确信

为什么这样做有效:

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

一般来说,这是一个解释器问题,在使用本地语言(如javascript)的语言中无法出现

解释器(从左到右读取)在提到右操作数之前遇到右操作数
n

我越想它,就越确信它是ruby解释器中的一个bug。正如@Cary指出的,控制流实际上是相同的:

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

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

关于:
在n=a.shift时放置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
后,才会检查该条件和相应的
移位
。另一种方法是

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

很好的解释。您可能需要添加另一个案例:前面有
n=0
的第二个示例。谢谢。事实上,前面有
n=0
的第二个示例是用伪代码编写的,与第一个示例完全相同,这就是我决定省略它的原因。UPD:哦,等等。我会的,thx。我建议,因为我认为一些读者可能会认为,在这种情况下,
0
可能会被打印出来。@CarySwoveland非常感谢,实际上我以前的答案很混乱,我已经完全重写了。控制流是无关的。
put n
中的
n
是一个方法调用,因为此时名为
n
的局部变量没有根据从左到右读取解析器定义。这只是一个局部变量的怪癖,需要特殊的大小写。它试图先解析
put n
,而不是执行。有许多与LALR下降相关的解析器问题会影响Ruby post条件。它们是bug,但是没有人打开关于它们的bug报告。有关:if_mod令牌的类似问题,请参阅。