2010-12-30 9 views
1

私は既存のルビー配列に新しい要素を作成する方法がいくつかあることを知っています。配列に入力された基準を満たしていないオブジェクトを拒否できますか?

myArray = [] 
myArray + other_array 
myArray << obj 
myArray[index] = obj 

また、私はに追加したり、そうでなければmyArrayの内容を変更するだけでなく.collect.map.concat.fill.replace.insert.join.pack.pushを使用することができますかなり確信しています。

しかし、myArrayに有効なHTTP/HTTPS URLが含まれていることを確認します。

どのように私はそのような行動を強制することができます誰も説明できますか?

答えて

7

私はあなたがsuperを呼び出す前に、プレフィルター引数に配列の受け入れブロックを指定し、(concatのような、より、)すべてあなたが言及メソッドをオーバーライドすることを可能にするモジュールを作成します。例:

module LimitedAcceptance 
    def only_allow(&block) 
    @only_allow = block 
    end 

    def <<(other) 
    super if @only_allow[ other ] 
    end 

    def +(other_array) 
    super(other_array.select(&@only_allow)) 
    end 
end 

require 'uri' 
my_array = [] 
my_array.extend LimitedAcceptance 
my_array.only_allow do |item| 
    uri = item.is_a?(String) && URI.parse(item) rescue nil 
    uri.class <= URI::HTTP 
end 
my_array << "http://phrogz.net/" 
my_array << "ftp://no.way" 
my_array += %w[ ssh://bar http://ruby-lang.org http:// ] 
puts my_array 
#=> http://phrogz.net/ 
#=> http://ruby-lang.org 
+0

よかった、ありがとう。 – bluekeys

1

挿入するときに使用します。 (テストされていない)。

def insert_to_array(first_array, second_array) 
    second_array.each do |i| { 
     if URI.parse(i).class == URI::HTTP 
     first_array.insert(i) 
     end 
    } 

    first_array 
end 
+0

+1をURI.parseに設定し、結果のクラスをテストします(テストは後ろ向きで、リクエストされているとhttpsを考慮していません)。 – Phrogz

1

必要な動作をカプセル化するためのクラスを作成します。次に、あなたが望む検証を行う<<メソッドを作成することができます。

このデータを扱うすべてのロジックをこのドメインクラスのメソッドに配置します。おそらく、新しいクラスに移動するために、このデータを使用しているコードが浮かび上がるでしょう。

私の2セント。

関連する問題