2013-11-15 68 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} 
當然

,你應該爲變量,不僅將幫助您調試也使代碼更容易理解

使用合適的名稱