2024 Clojure 状态调查 中分享您的想法!

欢迎!请查看 关于 页面以获取更多关于如何使用本站的信息。

+4
文档
已关闭
clojure.string/split 和 clojure.string/split-lines 继承了 java.lang.String#split(String,int) 去除尾部连续分隔符的奇怪默认行为


(clojure.string/split "banana" #"an")
⇒ ["b" "" "a"]
(clojure.string/split "banana" #"na")
⇒ ["ba"]
(clojure.string/split "nanabanana" #"na")
⇒ ["" "" "ba"]


在 split-lines 的情况下,逐行处理文件并重新连接会导致文件尾部换行符被截断。在这两种情况下,这种行为都很令人惊讶,并且无法从文档字符串中推断出来。split 的一个 workaround 是传递一个限制为 -1。

*建议:* 考虑到当前用户可能依赖于当前行为,附件中只更新了文档字符串以警告这种行为,并建议将限制设为 -1 以作为 workaround。

*补丁:* clj-1360-2.patch
提交备注:在 1.11.0-alpha3 中修复

5 个回答

0

评论者:jafingerhut

鉴于一些人可能在测试、部署等过程中实际上依赖于当前行为,此时记录文档可能比更改行为更安全。

我没有提出修改文档字符串的建议,但请注意,有几个关于该行为以及如何使用末尾的额外 "-1" 限制参数来获取所有拆分字符串的示例:https://docs.clojure.org/clojure_core/clojure.string/split

0

评论由:retrogradeorbit发表

这个bug刚刚影响到了我。+1,需要修复。如果我们只是记录下来而不改变行为, então 我们将得到一个令人惊讶且不一致的分割行为(为什么保留了内部空值,但去除了外部空值?)这与其他任何你用过的分割都不同。可选的-1限制参数看起来有点像是一个hack,但修复可以保持这个-1参数的工作。

编辑:这看起来是Java字符串类的行为: http://stackoverflow.com/questions/2170557/split-method-of-string-class-does-not-include-trailing-empty-strings
如果在该类型的clojure.string/split调用中默认将limit设置为-1那就很好了。

0

评论由:stu发表

这真的很糟糕,原始开发者受了打击。(哎。)

我讨厌Java的遗产代码,但鉴于这已经存在,并且人们很可能已经依赖了默认和负参数的行为,我认为最糟糕的选择是准确记录我们的语义。

0

评论由:alexmiller发表

在 clj-1360-2.patch 中已整合 CLJ-1857 的更改。

0
参考资料: https://clojure.atlassian.net/browse/CLJ-1360(由timmc报告)
...