建议将修剪函数(trim、triml和trimr)获得第二个arity,即函数{{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中其他函数现有的设计风格,我认为最佳解决方案就是简单地复制,以优化代码。