-1

発言に問題ありfind。の配列がありstuffます。特定のアイテムを検索しましたが、見つかりませんでした。ステートメント内のどの条件findが失敗しているかを知るためにデバッグするにはどうすればよいですか?

array.find {|x| (x.a == ::stuff::stuffiesA || x.a == ::stuff::stuffiesB) &&
                 x.b == thing &&
                 x.c == ::stuff::thingies}
4

2 に答える 2

1

IDE を使用している場合は、ウォッチ ウィンドウを使用して各式の結果を取得します。たとえばx.a == ::stuff::stuffiesA、ウォッチ ウィンドウに式として配置し、ブレーク ポイントを設定します。

または、ソースを少し変更して、簡単にすることもできます

array.find {|x|
         a = x.a == ::stuff::stuffiesA 
         b = x.a == ::stuff::stuffiesB
         c = x.b == thing
         d = x.c == ::stuff::thingies
           (a || b) &&
            c &&
            d}

もちろん、変数には適切な名前を使用する必要があります。これにより、デバッグが容易になるだけでなく、コードが理解しやすくなります。

于 2013-11-15T10:44:33.817 に答える
1

コメントには多すぎるので、再投稿します:

通常、ステートメントを変数に抽出してステップスルーします。ほとんどの IDE には、変数を抽出するためのショートカットがあります。RubyMine のものはCtrl+Alt+V

抽出後、次のようになります。

array.find {|x| 
  xa_eq_stuffies_a = (x.a == ::stuff::stuffiesA)
  xa_eq_stuffies_b = (x.a == ::stuff::stuffiesB)
  xb_eq_thing = (x.b == thing)
  xc_eq_thingies = (x.c == thing)

  (xa_eq_stuffies_a || xa_eq_stuffies_b) &&
  xb_eq_thing && xc_eq_thingies
}

その後、適切にデバッグできます。

また、コード構造を保持するために、 tap()メソッド (Ruby >= 1.9 が必要)を使用することもできますが、とにかくその列車事故をリファクタリングします :)

于 2013-11-15T10:43:07.213 に答える