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
为什么这样做:
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