-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 都有用于变量提取的快捷方式。来自 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)来保留代码结构,但无论如何我都会重构那个 train-wreck :)

于 2013-11-15T10:43:07.213 回答
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 回答