2014-02-06 40 views
0

我做了這些方法的類:判斷方法的語法

def promotion_available? 
    promotion.present? 
end 

def promotion 
    @promotion ||= PromotionUser.user(@user.id).available.first 
end 

然後,同事取出promotion方法,並以這種方式改變了謂詞promotion_available?

def promotion_available? 
    @promotion ||= PromotionUser.user(@user.id).available.first 
end 
  • 我可以直接在謂詞方法上設置一個實例變量?
  • 謂詞方法是否可以返回整個對象而不是true/false(我認爲不是,但我的同事說的相反)?
+1

@sawa:[原文]不,這不是很明顯,這顯然是一個錯字:) –

回答

3

我可以直接在謂詞方法上設置實例變量嗎?

是的,沒有什麼不對。我經常這樣做。

一個判斷方法可以返回一個完整的對象,而不是TRE /假(我認爲沒有,但我的同事說,對面)

是的,這也是常見的。但它只適用於你使用慣用的紅寶石真實性檢查。

if obj.promotion_available? # GOOD 
if obj.promotion_available? == true # BAD! 

記住,只有nilfalse紅寶石是falsey值。其他一切都是真實的。這就是爲什麼返回一個對象或零工作有點像返回真或假。

+0

問題不清楚它在問什麼級別:無論是關於句法正確還是關於約定。你的答案會繼承這種模糊性。但是,+1。 – sawa

1

雖然變「作品」,它引入了一個副作用:你必須調用promotion_available?之前,你可以實際使用的promotion(假設有一個promotion方法):

your_object.promotion    #=> nil 

your_object.promotion_available? 
your_object.promotion    #=> <#PromotionUser ...> 

你原來的代碼沒有按沒有這種依賴性。

IMO它會更直觀地保留promotion方法並刪除promotion_available?。你可以寫:

if obj.promotion 
    # with promotion 
else 
    # without promotion 
end 
+0

'promotion'方法被刪除了,所以他可能不需要使用它。 :) –

+0

@SergioTulentsev,除非它是隱式定義的,例如通過'attr_accessor' – Stefan

+0

是的,#promotion不再存在,而是我們調用#promotion_available定義的@promotion? – mirco

相關問題