我正在經歷一個嘗試避免臨時變量和過度使用條件的階段,我可以使用更流暢的編碼風格。我非常喜歡在想要獲得我需要返回的值的地方使用#tap
,但在返回之前先用它做點什麼。像點擊一樣的組合方法,但能夠返回不同的值?
def fluid_method
something_complicated(a, b, c).tap do |obj|
obj.update(:x => y)
end
end
比。程序:
def non_fluid_method
obj = something_complicated(a, b, c)
obj.update(:x => y)
obj # <= I don't like this, if it's avoidable
end
顯然上面的例子很簡單,但是這是在Ruby社區仍然一個很常見的編碼風格。我有時會使用#inject
也通過一系列過濾器傳遞對象:
things.inject(whatever) do |obj, thing|
thing.filter(obj)
end
比。程序:
obj = whatever
things.each do |thing|
obj = thing.filter(obj)
end
obj
現在我面臨着重複使用類似下面的條件,並尋找一個更流暢的方法來處理它:
def not_nice_method
obj = something_complex(a, b, c)
if a_predicate_check?
obj.one_more_method_call
else
obj
end
end
(略)清潔的解決方案是避免重複成本的臨時變量:
def not_nice_method
if a_predicate_check?
something_complex(a, b, c).one_more_method_call
else
something_complex(a, b, c)
end
end
我不禁感慨使用的東西幾乎喜歡的慾望#tap
雖然。
我可以在這裏遵循什麼其他模式。我意識到這對一些人來說只是無意義的糖,我應該轉向更有趣的問題,但我正在努力學習以更實用的方式寫作,所以我只是好奇長期的紅寶石主義者決定了什麼成爲解決這種情況的好方法。這些例子非常簡單。
冒着迂腐的風險,似乎你使用水龍頭誘導副作用是反功能的。功能程序員和語言避免或防止副作用。點擊的重點在於它不會返回在其中執行的內容。因此,可以使用兩種方法:調試和誘發副作用的方法。功能方法很簡單,就是將方法鏈接在一起或組合它們。 –
沒有風險,我想談論理論,但是如果沒有直接的問題,我擔心這個線程會被關閉,但是,'#update'會返回一個布爾值,而不是'obj'的值(這超出了我的控制),不輕拍解決需要第三個表達式返回原始值?我想了解更多正確的功能技巧:) – d11wtq
啊,我看到我可以改變:'update(something_complex(a,b,c))',我已經定義'update'來做'argument.update :x => y)'...雖然這會得到更詳細的更新參數需要傳入。 – d11wtq