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令牌的类似问题,请参阅。