2016-08-01 17 views
2

私はRails 4.2.7を使用しています。 Iは、配列内の要素のいずれかがゼロである場合は、上記離れ落ちる私のアレイ非nil要素にのみ関数を適用するにはどうすればよいですか?

data_cols = data_cols.collect{|x| x.strip || x } 

に(ストリップ)トリムこの簡潔な機能文字列を有しています。上記を変更して、nil要素には適用されないようにするにはどうすればよいですか?あなたはすべて残しておきたい場合は

cols.compact.map { |col| col.strip } 
# or 
cols.compact.map(&:strip) 

:あなたは完全に配列からnil値を削除したい場合は

答えて

4

を使用することができます値はゼロ以外の値にしか作用しませんが、単純にnil-guardを使うことができます:

# straightforward, no magic, works across rubies: 
cols.map { |col| col && col.strip } 

# a wee dose of magic in ruby 2.3 (safe navigation operator) 
cols.map { |col| col&.strip } 

あなたはより多くの慣用的なルビー風になりたい場合は最後に、あなたはアヒルタイピングを使用して、オブジェクトが、彼らは「strip'ped」ことができるかどうかを自分自身を整理させることができます:

cols.map { |col| col.respond_to?(:strip) ? col.strip : col } 
+0

私はあなたが[安全なナビゲーション演算子](http://mitrev.net/ruby/2015呼ばうれしいです/ 11/13/the-operator-in-ruby /)を使用します。いくつかの点:1) 'col && col.strip || col'を 'col && col.strip'に単純化することができる、2)' [false] .map {| col |もしあなたが 'nil'を取り除くことについて言及されていないので、あなたは答えの最初の部分をストライキは "すべての値を保持するが、"。 –

+0

@CarySwoveland 1)良いキャッチ;更新しました。 2)固定。 3)このタイプの質問のより広い文脈では便利だと思います。この文脈で共通の ' .to_proc'というイディオムを説明する機会を提供します。乾杯! – coreyward

0

結果配列にnil値を依頼したいかどうかによって異なります。ない場合は、あなただけcompactを使用することができます。

data_cols = data_cols.compact.collect{|x| x.strip || x } 

コンパクトは、アレイ内のすべてのnilの値を削除します。

あなたがnilの値を保持したい場合は、あなたがあなたの状態を変更する必要があります。

data_cols = data_cols.compact.collect{|x| x ? x.strip : nil } 
+1

マイナーニックピック:2番目の例で 'x'が偽でnilでない場合、' nil'に置き換えられます。望ましいかもしれませんが、予想外の状態を招くこともあります。 – coreyward

関連する問題