2013-02-19 71 views
0

的RubyMine标志可变发现为潜在未定义。我认为答案是将变量找到在开始之外,但我然后进入一个永不退出的紧密循环。我确信这是一个区块范围问题,但缺乏红宝石的体验来了解问题所在。我假设,这是被标记因为发现内声明开始,所以这里的问题是..这是有效的代码或者是的RubyMine的检查错在这种情况下?可能未定义局部变量

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

回答

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 boolwhile陈述的另一种形式,它也执行在含有变量范围:

begin 
    found = 'asdf' 
end while false 
puts found 

威尔输出asdf

+0

是的,上面的代码很好,而且rubymine检查器不正确? – 2013-02-19 11:05:46

+0

我相信如此。我也使用rubymine,它偶尔也会对我造成错误。 – 2013-02-19 11:09:23

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) 

写但是,如果没有尾巴的优化则可能会失败堆栈溢出:)

相关问题