2013-02-19 44 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) 

寫但是,如果沒有尾巴的優化則可能會失敗堆棧溢出:)