2016-05-15 54 views
0

例如匹配的第一條件,有這樣的一個數組的值:如何找到mulpitple條件

a = [1,2,3] 

我想找到一個值,該值2,但如果不存在找到35

result = a.find{|i| i == 2} || a.find{|i| i == 3} || a.find{|i| i == 5} 

當然,真正的價值是更復雜的,我可以寫的功能更簡潔嗎?

+3

你想這樣做嗎? '[2,3,5] .find {| i | a.include?(我)}' – 2016-05-15 05:51:32

回答

1

我會推薦使用封裝每個條件的單獨驗證器。它將幫助您解耦您的業務邏輯。

考慮這一點 - 而不是整數數組你有汽車類實例

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) } } 

好處就在這裏你不不必檢查具體的業務邏輯,而只需檢查任何驗證器匹配的返回元素的機制。此外,當新的驗證出現 - 你只是不參考,以測試其邏輯的休息

0

你可以使用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'的建議(在評論中)不應該被忽視。