代碼如下。
def call
banners = []
banners.push(banner1) if condition1?
banners.push(banner2) if condition2?
banners.push(banner3) if condition3?
旗幟
end
def banner1
{
type: BANNER1,
display_value: 'banner_1'
}
end
是否有更干凈的方法來寫這個?可以用更少的代碼行嗎?
uj5u.com熱心網友回復:
不做人肉編譯器的一個方法是使用回圈:
def call
[:banner1, :banner2, :banner3].filter_map do |name|
send(name) if send("#{name}?"/span>)
end。
end。
這假定你要呼叫的方法的名稱和預判方法之間存在某種關聯。
如果沒有,就用一個哈希值代替:
def call<
{
banner1: :condition1?。
banner2: :condition2?,
banner3: :condition3?.
}.filter_map do |method, condition| >。
send(method) if send(condition)
}
end
當然,這確實引出了一個問題,即這些方法是否可以通過DRY:ed變成一個接受引數的單一方法,或者是否需要進行其他重構。
uj5u.com熱心網友回復:
如果你有可能將條件移到banner方法中:
def call
[banner1, banner2, banner3].reject(&: empty?)
結束。
def banner1
return {}。unless condition1?
{
type: BANNER1,
display_value:'banner_1'
}
end
def banner2
return {}。unless condition2?
{
type: BANNER2,
display_value:'banner_2'
}
end
def banner3
return {}。unless condition3?
{
type: BANNER3,
display_value: 'banner_3'
}
end
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/307036.html
標籤:
上一篇:為什么控制器名稱是復數,而application_controller本身是單數?
下一篇:<p>我正試圖創建一個小應用程式,用SwiftUI控制我的Hue燈,但我就是無法通過這個JSON解碼/迭代。關于如何做到這一點,有<strong>很多</strong&g
