ruby-on-rails - .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"]
解决方案
让我们看一下方法的文档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"]
推荐阅读
- c# - 如何按从 1 到 10 的顺序选择一个值
- php - 如何在 Debian 9 (Docker) 上安装特定的 PHP 版本
- c - 为什么这个程序输出37?
- netbeans-8 - 为什么运行项目时突然弹出模块没有部署?在此之前可以正常运行
- c++ - 有没有办法从 .txt 文件中打印单个单词而不遗漏行?
- javascript - WEB Mobile:无控件自动播放视频
- javascript - 无法在反应 js 中传递带有表单数据的 JSON 对象(始终 json JSON 为空)
- c - 查找用户输入的最大数字,并确定最大数字输入了多少次
- python - 如何从单个列表中连接字符串
- java - 运行简单的 slick 应用程序时出错