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

鉴于一些人可能在实际测试、部署等后依赖于当前的行为,因此此时 documenting 可能会更安全。

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

0

评论者:retrogradeorbit

这个bug刚刚咬了我。+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调用中,limit默认为-1将会很方便。

0

评论者:stu

这真是太恶心了,原始的开发者被打中了脖子。(哎。)

我讨厌Java的泄漏,但鉴于这已经存在,并且人们可能会依赖于默认和负参数的行为,我认为最好的选择是精确记录我们的语义。

0

评论者:alexmiller

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

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