Ruby:为什么'while(p ||(p = exns.shift))'与'while p || = exns.shift'不一样?

时间:2014-08-06 07:01:58

标签: ruby language-lawyer

这里有什么问题?我不知道这两个片段的表现如何不同,但他们确实如此。

完整代码,尝试使用其中一个:

class T
  def initialize
    @e=[4,2]
  end
  def shift
    r=@e.shift
    puts "[#{r.inspect}]"
    r
  end
end

exns=T.new

while (p || (p=exns.shift))
#while p ||= exns.shift
  puts "p: #{p.inspect}"
  p -= 1
  p=nil if p<1
  puts "   #{p.inspect}"
  puts "T" if p
end

&#39; while(p ||(p = exns.shift))&#39;由于某种原因,似乎永远不会发生短路。我想知道原因。

1 个答案:

答案 0 :(得分:4)

您的问题在于您选择为变量命名的字母 - p与其他字母(例如q)不同,因为它也是内核方法p()的名称:

p
# => nil
q
# NameError: undefined local variable or method `q' for main:Object

因为这个原因,因为你没有在while循环之前定义一个局部变量名p,所以它实际上只在循环范围内声明

要了解这一点至关重要,只需在循环之前添加以下行:

p = nil

现在,两种选择都是一样的。