.split之后的Ruby .reject行为异常

时间:2018-08-07 20:59:09

标签: ruby-on-rails ruby

为了在,;上拆分字符串,我使用了以下简单代码

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"]

2 个答案:

答案 0 :(得分:4)

让我们看看reject!方法的docs

  

等效于#delete_if,从自身中删除该块评估为true的元素,但如果未进行任何更改,则返回nil。

由于'entry1, entry2'.split(/[\s,;]/)的值为["entry1", "", "entry2"],因此i。 e。有一个空字符串。那意味着有工作要做。

但是'entry1,'.split(/[\s,;]/)的值为["entry1"],因此返回nil,因为未进行任何更改。

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

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

或者依靠reject!突变的变量:

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

答案 1 :(得分:1)

我认为您要添加拒绝以从拆分中删除空值,您可以将其更改为类似这样的方式,以消除这种需要:

irb(main):016:0> string = "entry1, entry2; sadq;as"
=> "entry1, entry2; sadq;as"
irb(main):017:0> string.split(/\s*,\s*|\s*;\s*/)
=> ["entry1", "entry2", "sadq", "as"]

或者这是另一种选择,使用map删除空白

irb(main):016:0> string = "entry1, entry2; sadq;as"
=> "entry1, entry2; sadq;as"
irb(main):020:0> string.split(/,|;/).map(&:strip)
=> ["entry1", "entry2", "sadq", "as"]

它不会回答您的问题,但是可以帮助您在此处编写更简单的代码