2016-08-01 4 views
2

Ich verwende Rails 4.2.7. Ich habe diese Funktion, die prägnante (Bändern) Strings in meinem ArrayWie kann ich meine Funktion nur auf Nicht-Null-Elemente anwenden?

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

jedoch, wenn eines der Elemente in dem Array trimmt ist gleich Null, das oben auseinander fällt. Wie kann ich das oben genannte ändern, so dass es nicht für Nullelemente gilt?

Antwort

4

verwenden Wenn Sie nil Werte aus dem Array vollständig entfernen möchten, können Sie compact verwenden:

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

Wenn Sie alle behalten wollen Werte, aber nur mit den Nicht-Null-Werten arbeiten, können Sie einfach einen Nullschutz verwenden:

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

Schließlich, wenn Sie mehr idiomatische und Rubin-esque sein wollen, können Sie Ente-Typisierung und die Objekte lassen sich aussortieren, ob oder nicht, kann sie „strip'ped“ werden:

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

Ich bin froh, dass Sie auf die [sichere Navigation operator] bezeichnet (http://mitrev.net/ruby/2015/11/13/the-operator-in-ruby /). Ein paar Punkte: 1) 'col && col.strip || col 'kann zu 'col && col.strip' vereinfacht werden, 2)' [false] .map {| col | col.strip if col.responds_to? (: strip)} # => [nil] ', 3) Da in der Frage nach dem Entfernen von' nil' keine Erwähnung erfolgt, schlage ich vor, dass Sie den ersten Teil Ihrer Antwort auf die Ende und Streik "behalte alle Werte, aber". –

+0

@CarySwoveland 1) Guter Fang; aktualisiert. 2) behoben. 3) Ich denke, dass es im breiteren Kontext dieser Art von Frage nützlich ist, und es bietet eine Gelegenheit, das allgemeine " .to_proc" Idiom in diesem Zusammenhang zu veranschaulichen. Prost! – coreyward

0

Hängt davon ab, ob Sie weiterhin die Nullwerte in Ihrem Ergebnisarray haben möchten. Wenn nicht, können Sie einfach compact verwenden:

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

compact entfernt alle Null-Werte im Array.

Wenn Sie null Werte behalten wollen, müssen Sie Ihren Zustand ändern:

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

Kleiner Nitpick: Wenn 'x' im zweiten Beispiel falsch, aber nicht null ist, wird es durch' nil' ersetzt. Könnte wünschenswert sein, könnte aber auch einen unerwarteten Zustand herbeiführen. – coreyward

Verwandte Themen