0

Rubymine 将发现的变量标记为可能未定义。我认为答案是将在开始之外找到的变量移动,但然后我进入了一个永远不会退出的紧密循环。我确信这是一个块范围问题,但缺乏 ruby​​ 经验来了解问题所在。我假设这是被标记的,因为found是在begin内声明的,所以这里的问题是..这是有效的代码还是 Rubymine 的检查器在这种情况下是错误的?

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

2 回答 2

1

根据ruby​​spec 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

于 2013-02-19T11:01:24.580 回答
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)

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

于 2013-02-19T11:27:22.190 回答