0

Rubymine は、見つかった変数に未定義の可能性があるというフラグを立てます。答えは、begin の外で見つかった変数を移動することだと思っていましたが、終了することのないタイトなループに入ります。これはブロックスコープの問題だと確信していますが、問題が何であるかを理解するためのルビーの経験がありません。find が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

しばらくの間rubyspecによると:

 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 に答える