建议将修剪函数(trim、triml 和 trimr)添加第二个参数,该参数为函数 {{trim?}}
[trim? ^CharSequence s]
{{trim?}} 首先用于支持部分函数。
新文档字符串将是
“从字符串的两端删除字符。
如果省略 trim?,则删除空白字符。当提供时,它接受
一个字符,如果应删除该字符则返回 true。”
示例测试
(deftest t-trim
(is (= "foo" (s/trim " foo \r\n")))
(is (= "bar" (s/trim "\u2000bar\t \u2002")))
;; 额外测试
(is (= "bar" (s/trim "$%#\u2000bar\t \u2002%$#"
#(or (Character/isWhitespace %) ((set "$#%") %))))))
类似于Python的strip -
https://docs.pythonlang.cn/2/library/stdtypes.html#str.strip
**方法:** 提出的解决方案不是很DRY,但它遵循文件顶部的设计指南,更确切地说,是第3点
"3. 函数利用String实现细节来
编写高性能的循环/递归,而不是使用高阶
函数。(这通常不是通用应用程序
代码中的约定。)"
最初我有一个解决方案,其中我用 pred 替换了当前实现中的 Character/isWhitespace。pred 被默认为 is-whitespace? 函数。
当然,该代码更易于阅读,甚至 trim-newline 也可以直接调用 trimr,从而删除大量重复代码,但它增加了始终调用函数的开销,而不是直接调用 Character/isWhitespace。
唯一能够使代码优化且DRY的方法是使用宏,但我认为这并不一定会导致更简洁的代码。
鉴于现有的 string.clj 中其他函数的设计风格,我认为最佳解决方案就是简单地复制以优化代码。