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
答案 0 :(得分:1)
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)
但是如果没有尾部优化,它可能会因堆栈溢出而失败:)