2013-05-13 58 views
-5

有沒有辦法讓這個Rails代碼漂亮起來?如何清理這個非常簡單的Rails函數?

def function 
    if new_record?      
    thing 
    else 
    thing + yet_another_thing 
    end 
end 

我不喜歡的thing重複這裏,所以我不知道是否有一個更清潔的方式。

感謝您的任何幫助。

+6

什麼是類'thing'? – sawa 2013-05-13 21:37:38

+1

非常通用...... – Mindbreaker 2013-05-13 21:53:07

+0

Ehm ...可能有thing.class調用的輸出嗎? – byterussian 2013-05-13 21:57:32

回答

3

這適用於支持+任何對象, (甚至是字符串。)

[thing, (yet_another_thing unless new_record?)].compact.inject(:+) 

它乾燥而可怕,就像被困在沒有水的沙漠中一樣。


您可能還能夠與閃避:

thing.dup.tap{|t| t << yet_another_thing unless new_record?} 

如果事情是一個整數這是不行的(你不能DUP它),也需要支持< <運營商。

也幹,但以不同的方式嚇人。

+0

同樣的模式工作正常字符串:只需更換'注入(:+)'和'join' – 2013-05-13 22:11:57

+1

的注射用繩子工作爲好。 – 2013-05-13 22:13:04

0

如果你不想重複thing,那麼這可能是一個解決方案。

def function 
    result = thing 
    result += yet_another_thing unless new_record? 
    result 
end 
+1

你重複三次'result'而不是重複'thing'兩次。我認爲這沒有幫助。 – sawa 2013-05-13 21:46:49

+0

如果_thing_是一個不平凡的表達式或函數調用,那麼它是一個有用的模式。 – 2013-05-13 22:09:14

0

你可以使用一個在線如果

def function 
    return thing if new_record? 
    thing + yet_another_thing 
end 
0

如果thingyet_another_thing是字符串,你可以這樣做:

thing + (yet_another_thing unless new_record?).to_s 
+0

他們不是:-( – Tintin81 2013-05-13 21:54:21

+4

串那麼,什麼是他們 – tessi 2013-05-13 21:54:55

1

三元算子呢?

def function 
    new_record? ? thing : (thing + yet_another_thing) 
end 

如果我們知道你在哪裏使用它或者包含在變量中,這將會更有幫助。

0

如果事情和yet_another_thing一些方法你打電話:

def function 
    thing 
    yet_another_thing if new_record? 
end