5

我想delete_if从数组中删除空字符串。使用下面的解决方案,数组仍然包含许多空字符串。

products = my_text.split(/\t+/)
products.delete_if {|element| element == " " || "" || element.nil?}

有什么遗漏吗?

4

5 回答 5

14

Ed S 解释了您的代码问题。
否则,您可以这样做

products.reject! { |s| s.nil? || s.strip.empty? }

为什么需要先测试nil??让我们检查几行。

nil.strip
# NoMethodError: undefined method `strip' for nil:NilClass
"   ".strip
# => ""

现在,以不同的顺序,如果对象是字符串,代码会做什么,然后如果它是 nil。

"  ".strip || "  ".nil?
# => ""
nil.strip || nil.nil?
# NoMethodError: undefined method `strip' for nil:NilClass
# Oh you don't want that to happen, do you?

这意味着你不想strip.empty?在你的对象是nil.
如您所知,当您拥有 时a || b,如果 a 为真(即 notnilfalse),b则永远不会被调用。
您首先测试字符串是否为nil; 如果是,您不需要检查正确的部分(因此您不会收到未定义的方法错误)并且该对象将从您的产品列表中删除。

于 2013-09-27T01:54:54.167 回答
2

那么这是错误的:

element == " " || "" || element.nil?

应该

products = products.delete_if {|element| element == " " || element == "" || element.nil?

请注意,您|| "" ||在那里有一个。您没有与 进行比较element,而是在测试(其评估结果为btw,搞砸了您的空字符串检查)""的“真实性” 。""true

这当然假设您对“空字符串”的定义是 nil " "、 或""。关于什么

"  " 

甚至

"         "

?

于 2013-09-27T00:56:35.973 回答
1

String#strip每个元素然后拒绝空元素:

arr.map!(&:strip).reject!{|s| s.empty?}
于 2020-02-08T20:31:01.743 回答
1

我可能有点落后(6年前你在哪里?),但这是我的建议,处理nil""" "

arr.compact.map(&:strip).reject(&:empty?)

例如: ["", nil, "toto", " "].compact.map(&:strip).reject(&:empty?)

# => ["toto"]

快乐Covid锁定!

于 2020-03-25T10:35:16.493 回答
0

因此,如果您有一个字符串数组,可以使用reject函数轻松删除空值:

有一个这样的字符串数组:

array = ["", "ABC", "DEF", ... , "", "ZXY"]

如果您使用reject

array.reject(&:empty?)

将输出一个干净的字符串数组:

=> ["ABC", "DEF", "ZXY"]

于 2020-08-14T22:23:45.683 回答