find语句中的调试逻辑

时间:2013-11-15 10:28:28

标签: ruby

我对find语句有疑问。我有一个stuff数组。我搜索了一个特定的项目,但没有找到它。如何调试以了解find语句中的哪些条件失败?

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

2 个答案:

答案 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}

当然你应该为变量使用适当的名称,这不仅可以帮助你调试,还可以使代码更容易理解