建议将 trim 函数(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。
我唯一能看到优化并更符合 DRY 原则的方法是使用宏,但我认为这并不一定会导致更好的代码。
考虑到 string.clj 中其他函数的现有设计风格,我认为最好的解决方案就是简单地复制以优化代码。