我想delete_if
从数组中删除空字符串。使用下面的解决方案,数组仍然包含许多空字符串。
products = my_text.split(/\t+/)
products.delete_if {|element| element == " " || "" || element.nil?}
有什么遗漏吗?
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 为真(即 notnil
或false
),b
则永远不会被调用。
您首先测试字符串是否为nil
; 如果是,您不需要检查正确的部分(因此您不会收到未定义的方法错误)并且该对象将从您的产品列表中删除。
那么这是错误的:
element == " " || "" || element.nil?
应该
products = products.delete_if {|element| element == " " || element == "" || element.nil?
请注意,您|| "" ||
在那里有一个。您没有与 进行比较element
,而是在测试(其评估结果为btw,搞砸了您的空字符串检查)""
的“真实性” 。""
true
这当然假设您对“空字符串”的定义是 nil " "
、 或""
。关于什么
" "
甚至
" "
?
String#strip每个元素然后拒绝空元素:
arr.map!(&:strip).reject!{|s| s.empty?}
我可能有点落后(6年前你在哪里?),但这是我的建议,处理nil
,""
和" "
arr.compact.map(&:strip).reject(&:empty?)
例如:
["", nil, "toto", " "].compact.map(&:strip).reject(&:empty?)
# => ["toto"]
快乐Covid锁定!
因此,如果您有一个字符串数组,可以使用reject
函数轻松删除空值:
有一个这样的字符串数组:
array = ["", "ABC", "DEF", ... , "", "ZXY"]
如果您使用reject
:
array.reject(&:empty?)
将输出一个干净的字符串数组:
=> ["ABC", "DEF", "ZXY"]