21

配列の nil または空の要素を除外する、より慣用的な方法を探しています。

次の形式のメソッドが多数あります。

def joined
    [some_method, some_other_method].compact.reject(&:empty?).join(' - ')
end

これはsome_methodandの結果を受け取り、some_other_method非 nil (compactは本質的に と同等reject(&:nil?)) で空でないものだけを返します。

Array または Enumerable に、同じことを一度に取得できるものはありますか?

4

6 に答える 6

21

reject(&:blank?)Rails では、または同等のことができますselect(&:present?)

これがRailsアプリ用ではなく、これを頻繁に行う場合は、独自のヘルパーを定義するStringか、フィルタリングしている他のものを定義することをお勧めします.

class String
  alias :blank? :empty?
end

class NilClass
  def blank?
    true
  end
end
于 2012-11-21T19:04:12.163 に答える
3

次のコードでうまくいくはずです。

[some_method, some_other_method].reject{|i| i.nil? || i.empty? }

配列クラスを拡張するために簡単に使用できます。

class Array

  def purge
    self.reject{|i| i.nil? || i.empty? }
  end 

end

そして、次のことができます:

[some_method, some_other_method].purge
于 2012-11-21T19:06:15.860 に答える
2

おそらく、NilClassの単純な拡張が1つだけ必要ですか?

class NilClass
  def empty?
    true
  end
end
于 2012-11-25T10:51:05.507 に答える
2

モンキーパッチは受け入れられましたか?:)

あなたはこれを試すことができます:

class Array
  def tight
    self.compact.reject { |i| i.size.zero? }
  end
end

p [nil, 1, ''].tight
#=> [1]
p ['', nil, 2].tight
#=> [2]

sizeに応答するオブジェクトだけでなく、に応答するすべてのオブジェクトで機能しますempty?

于 2012-11-21T19:31:44.370 に答える
0

@trans は私の +1 を気に入ってくれましたが、さらに検討した結果、次の結論に達しました。

すべてが であるという前提に立つ場合、Object実際に必要なのはclass Object

class Object
    def empty?
        self == 0 or not self
    end
end

これは私の要件を満たしています:

1.9.3 :001 > d=[Object.new, Class, {a:nil}, 'a', '', [], 1, 1.1, 0, 0.0, 0x0, 0E0, true, false, nil]
 => [#<Object:0x007fd56c086918>, Class, {:a=>nil}, "a", "", [], 1, 1.1, 0, 0.0, 0, 0.0, true, false, nil] 
1.9.3 :002 > d.reject(&:empty?)
 => [#<Object:0x007fd56c086918>, Class, {:a=>nil}, "a", 1, 1.1, true] 

あなたのはどうですか?もっと何か必要ですか?アップストリームでの言語変更の動機付けを支援するために投票して、不安を表明するか、黙って同意してください。

nJoy!

于 2013-05-15T11:58:33.557 に答える