find
我的陈述有问题。我有一个数组stuff
。我搜索了一个特定的项目,但没有找到。如何调试以了解find
语句中的哪些条件失败?
array.find {|x| (x.a == ::stuff::stuffiesA || x.a == ::stuff::stuffiesB) &&
x.b == thing &&
x.c == ::stuff::thingies}
find
我的陈述有问题。我有一个数组stuff
。我搜索了一个特定的项目,但没有找到。如何调试以了解find
语句中的哪些条件失败?
array.find {|x| (x.a == ::stuff::stuffiesA || x.a == ::stuff::stuffiesB) &&
x.b == thing &&
x.c == ::stuff::thingies}
评论太多了,所以重新发布:
通常我将语句提取到变量并逐步执行。大多数 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 :)
如果您使用的是 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}
当然,您应该为变量使用适当的名称,这不仅可以帮助您调试,还可以使代码更易于理解