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 的一个解决方案是传递 -1 的限制。

*建议:* 由于当前的用户可能依赖于当前的行为,因此仅更新文档字符串以警告这种行为,并建议使用 -1 作为限制来解决这个问题。

*补丁:* clj-1360-2.patch
已关闭,备注: 已在 1.11.0-alpha3 中修复

5 个答案

0

评论由:jafingerhut 撰写

考虑到某些人可能实际上依赖于在测试、部署等之后的行为,在此处进行文档编写可能比更改行为更安全。

我目前没有对修改后的文档字符串的建议,但请注意,有关这种行为的示例以及如何使用额外的“-1”限制参数在最后获取所有拆分字符串的示例,请参阅https://docs.clojure.org/clojure_core/clojure.string/split

0

评论由:retrogradeorbit

这个错误刚让我吃了亏。Hope 类型的 +1 以修复它。如果我们仅仅记录并保持现有的行为,那么我们将会有一个令人惊讶和不一致的split行为(为什么保留内部空值,但删除外部空值?),这与你以前使用过的任何split都不同。可选的-1限制参数看起来很糟糕,但修复可以保留这个 -1参数工作。

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

0

评论由:stu

这真的很糟糕,原始开发者被打了头部。(疼)

我不喜欢Java泄漏,但鉴于这已经发布,而且人们可能已经在依赖默认和负参数行为,我认为最差的赌注是精确记录我们所拥有的语义。

0

评论由:alexmiller

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

0
...