例如匹配的第一條件,有這樣的一個數組的值:如何找到mulpitple條件
a = [1,2,3]
我想找到一個值,該值2
,但如果不存在找到3
等5
。
result = a.find{|i| i == 2} || a.find{|i| i == 3} || a.find{|i| i == 5}
當然,真正的價值是更復雜的,我可以寫的功能更簡潔嗎?
例如匹配的第一條件,有這樣的一個數組的值:如何找到mulpitple條件
a = [1,2,3]
我想找到一個值,該值2
,但如果不存在找到3
等5
。
result = a.find{|i| i == 2} || a.find{|i| i == 3} || a.find{|i| i == 5}
當然,真正的價值是更復雜的,我可以寫的功能更簡潔嗎?
我會推薦使用封裝每個條件的單獨驗證器。它將幫助您解耦您的業務邏輯。
考慮這一點 - 而不是整數數組你有汽車類實例
class Car
attr_accessor :producer, :colour, :max_speed
def initialize(producer, colour, max_speed)
@producer = producer
@colour = colour
@max_speed = max_speed
end
end
現在,你要選擇汽車,由MAX_SPEED,顏色,最後由製片
cars = [
Car.new(:ford, :black, 200),
Car.new(:fiat, :yellow, 170),
Car.new(:renault, :green, 200),
]
,而不是把所有的條件在一個地方,使用單獨的驗證器
class ColourValidator
def initialize(colour)
@colour = colour
end
def matching?(car)
car.colour == @colour
end
end
class MaxSpeedValidator
def initialize(max_speed)
@max_speed = max_speed
end
def matching?(car)
car.max_speed == @max_speed
end
end
class ProducerValidator
def initialize(producer)
@producer = producer
end
def matching?(car)
car.producer == @producer
end
end
當然vaidators可能要複雜得多 - 這只是一個想法
,並沒有在一個地方創建驗證
validators = [
ProducerValidator.new(:renault)
]
,後來在你的代碼,你可以寫
cars.find { |car| validators.any? { |v| v.matching?(car) } }
好處就在這裏你不不必檢查具體的業務邏輯,而只需檢查任何驗證器匹配的返回元素的機制。此外,當新的驗證出現 - 你只是不參考,以測試其邏輯的休息
你可以使用Array#&:
([2,3,5] & [1,2,3]).first #=> 2
([0,3,5] & [1,2,3]).first #=> 3
([0,4,5] & [1,2,3]).first #=> nil
從DOC:「命令是從原始數組保存下來。」
@argus'的建議(在評論中)不應該被忽視。
你想這樣做嗎? '[2,3,5] .find {| i | a.include?(我)}' – 2016-05-15 05:51:32