我希望使用delete_if
方法从数组中删除空字符串。但是,下面的解决方案仍然会保留许多空字符串。
products = my_text.split(/\t+/)
products.delete_if {|element| element == " " || "" || element.nil?}
还有什么遗漏吗?
products.reject! { |s| s.nil? || s.strip.empty? }
为什么需要先测试nil?
让我们来看几行代码。
nil.strip
# NoMethodError: undefined method `strip' for nil:NilClass
" ".strip
# => ""
" ".strip || " ".nil?
# => ""
nil.strip || nil.nil?
# NoMethodError: undefined method `strip' for nil:NilClass
# Oh you don't want that to happen, do you?
nil
时,您不希望调用strip.empty?
。而且,正如您所知,当您有a || b
时,如果a为真(即非nil
和false
),则b
将永远不会被调用。nil
;如果是,则无需检查右侧(因此您将不会收到未定义的方法错误),并且该对象将从产品列表中删除。compact_blank
函数,
https://apidock.com/rails/v6.1.3.1/ActionController/Parameters/compact_blank。["a", "", " "].compact_blank
=> ["a"]
这是错误的:
element == " " || "" || element.nil?
应该是这样的
products = products.delete_if {|element| element == " " || element == "" || element.nil?
||""||
。您并没有将element
与""
进行比较,而是测试了""
的“真实性”(顺便提一下,""
会评估为true
,这会破坏您的空字符串检查)。" "
或""
。其他情况怎么办?" "
" "
?
我可能有点晚(你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"]
products.reject! { |product| product.nil? || product.strip.empty? }
,否则你会尝试对nil
进行strip
操作。 - Momers
是否为nil
之前向s
发送了strip
。这应该会引发NoMethodError: undefined method 'strip' for nil:NilClass
。通过改变顺序,您可以避免这种情况。 - Momer