请在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-line的情况下,逐行处理文件并重新连接会导致文件尾部换行的截断。在这两种情况下,行为出人意料,无法从文档字符串中推断出来。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

这个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调用中,默认将极限设为-1将非常好。

0

评论者:stu

这真的很恶心,原始开发者挨打了。(好疼。)

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

0

评论者:alexmiller

将CLJ-1857的修改集成到clj-1360-2.patch中。

0
...