我对find
语句有疑问。我有一个stuff
数组。我搜索了一个特定的项目,但没有找到它。如何调试以了解find
语句中的哪些条件失败?
array.find {|x| (x.a == ::stuff::stuffiesA || x.a == ::stuff::stuffiesB) &&
x.b == thing &&
x.c == ::stuff::thingies}
答案 0 :(得分: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)来保存代码结构,但无论如何我都会重构那个火车残骸:)
答案 1 :(得分: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}
当然你应该为变量使用适当的名称,这不仅可以帮助你调试,还可以使代码更容易理解