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