首页 > 解决方案 > .split 之后的 Ruby .reject 行为怪异

问题描述

为了拆分字符串,,或者;我使用这个简单的代码

string.split(/[\s,;]/).reject!(&:empty?)

它适用于诸如此类的字符串

"entry1, entry2, entry3"
"entry1"
"entry1, entry2,"

但问题在于"entry1,"(单个元素后跟逗号)

请看看这些例子

2.2.4 :033 > 'entry1,'.split(/[\s,;]/).reject!(&:empty?)
 => nil
2.2.4 :034 > 'entry1, entry2'.split(/[\s,;]/).reject!(&:empty?)
 => ["entry1", "entry2"]
2.2.4 :035 > 'entry1, entry2,'.split(/[\s,;]/).reject!(&:empty?)
 => ["entry1", "entry2"]

所以

2.2.4 :033 > 'entry1,'.split(/[\s,;]/).reject!(&:empty?)
 => nil

2.2.4 :037 > 'entry1,'.split(/[\s,;]/)
 => ["entry1"]

标签: ruby-on-railsruby

解决方案


让我们看一下方法的文档reject!

等价于#delete_if,从self中删除块评估为true的元素,但如果没有进行任何更改则返回nil。

由于'entry1, entry2'.split(/[\s,;]/)计算结果为["entry1", "", "entry2"],即有一个空字符串。这意味着有工作要做。

'entry1,'.split(/[\s,;]/)计算结果为["entry1"],因此nil返回,因为没有进行任何更改。

为了使其更具可预测性,我建议使用reject以下方法:

'entry1,'.split(/[\s,;]/).reject(&:empty?)
# => ["entry1"]

或依赖于由 变异的变量reject!

a = 'entry1,'.split(/[\s,;]/)
a.reject(&:empty?)
a # => ["entry1"]

推荐阅读