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

这个错误也影响了我。强烈建议修复。如果我们只记录行为而不修改,我们将有一个令人惊讶且不一致的行为,即分隔的后缀空值被删除,而外部的空值保留,这与我们使用的所有其他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-1360-2.patch中整合了CLJ-1857的更改。

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