2013-11-15 110 views
-1

我对find语句有问题。我有一组stuff。我搜索了一个特定的项目,但没有找到它。如何调试以了解find声明中的条件失败?查找语句中的调试逻辑

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

将变量提取到变量中,将它们结合在最后一行,并通过 – kostja

+0

步骤听起来似乎是一个好主意!我在哪里可以学习如何做到这一点? – Maidenone

+0

我前面说过,我是ruby的新手,在搜索“ruby find”时很难在google上找到任何内容,甚至很难用combinde逻辑找到任何内容。 PLZ激励你的赞赏! – Maidenone

回答

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()方法(需要红宝石> = 1.9)保存代码结构,但如果您使用的是IDE使用监视窗口来我反正是重构列车残骸:)

+0

在进入逻辑之前,像':: stuff :: stuffiesA'这样的表达式在Ruby中是不合语法的。所以整个代码不应该放在第一位。 – sawa

+0

@sawa - 你肯定是对的,我对ruby还不是很好:)因为我不确定前缀:: stand for(全局命名空间?)我在回答中忽略了它们 – kostja

1

得到每个表达式的结果。例如。将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} 
当然

,你应该为变量,不仅将帮助您调试也使代码更容易理解

使用合适的名称