2013-02-19 4 views
0

Rubymine flags переменная найден как потенциально неопределенный. Я думал, что ответ будет состоять в том, чтобы переместить переменную за пределы начала, но затем я перехожу в тупик, который никогда не выходит. Я уверен, что это проблема с блочным охватом, но у меня нет опыта рубинов, чтобы понять, в чем проблема. Я предполагаю, что это помечено, потому что найден объявлен в начинаются, поэтому вопрос здесь .. это действительный код или инспектор Rubyine в этом случае неправильно?Возможная неопределенная локальная переменная для условия цикла

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 bool это просто еще одна формы while заявления, он также выполняет в вмещающей области видимости переменной:

begin 
    found = 'asdf' 
end while false 
puts found 

Выведет asdf

+0

Да, так это выше код штрафа, а рубиновый инспектор неправильный? –

+0

Я так считаю. Я также использую рубин, и иногда он также меня неправильно оценивает. –

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) 

Но без оптимизации хвоста это может произойти сбой с переполнением стека :)

Смежные вопросы