请在 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 发布

这个错误刚刚咬了我。请加1修复。如果我们只是记录并保持行为不变,那么我们就得到了一个出乎意料且不一致的行为拆分(为什么保留内部空值,但删除外部值?)这与您使用过的其他拆分方式都不同。可选的-1限制参数看起来很笨拙,但修复可以保持此-1参数的正常工作。

编辑:这似乎是Java字符串类的行为: http://stackoverflow.com/questions/2170557/split-method-of-string-class-does-not-include-trailing-empty-strings
如果在不使用limit参数的情况下默认进行such类型的clojure.string/split调用,那就更好了。

0 投票

评论由: stu 发布

这真的很令人反感和不舒服,原始开发者被击中了颈部。(哎呀。)

我恨Java的泄漏,但鉴于这已经在外面,人们可能已经依赖了默认和负数参数的行为,我认为最不好的办法是将我们确切具有的语义记录下来。

0 投票

评论由: alexmiller 发布

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

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