建议将截断函数(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. 函数通过利用字符串实现细节来
编写高性能循环/递归而不是使用高阶
函数。(这通常不是通用应用
代码中的惯例。)”
最初我有一个解决方案,其中我将 Character/isWhitespace 从当前实现中替换为调用 pred。pred 被默认为 is-whitespace? 函数。
当然,那段代码更简洁,trim-newline 也可以直接调用 trimr,从而消除了许多重复,但它增加了始终调用函数的开销,而不是直接调用 Character/isWhitespace。
我认为唯一能够获得优化且 DRYer 的代码的方法是使用宏,但我认为这并不一定会导致更简洁的代码。
鉴于 string.clj 中其他函数的现有设计风格,我认为最好的解决方案是通过重复以提高代码的优化。