循环条件可能未定义的局部变量

时间:2013-02-19 10:37:47

标签: ruby loops rubymine

Rubymine将变量发现标记为可能未定义。我认为答案是将变量 found 移到开头之外,但我会进入一个永不退出的紧密循环。我确信这是一个块区域范围问题,但缺乏红宝石经验来实现问题所在。我假设这是被标记的,因为发现是在开始中声明的,所以这里的问题是..这个有效的代码还是Rubymine的检查员在这个例子中错了?

begin
  found = false
  @some_collection.keys.each do |key|
    found = evaluate_collection(@some_collection[key], key) unless found
  end
end while found

2 个答案:

答案 0 :(得分:1)

根据rubyspec for while

 it "executes code in containing variable scope" do
    i = 0
    while i != 1
      a = 123
      i = 1
    end

    a.should == 123
  end

由于begin...end while bool只是while语句的另一种形式,它也在包含变量范围内执行:

begin
  found = 'asdf'
end while false
puts found

将输出asdf

答案 1 :(得分:1)

您可以稍微重构一下代码,因此不应该发出警告

found = false
while !found
  @some_collection.detect do |k, v|
    found = evaluate_collection(v, k)
  end
end

或者你可以用递归来写它

find = lambda do |collection|
  collection.each do |k,v|
    return found if found = evaluate_collection(v, k)
  end
  find.call(collection)
end

found = find.call(@some_collection)

但是如果没有尾部优化,它可能会因堆栈溢出而失败:)