建议将截断函数(trim、triml 和 trimr)获得一个第二参数,该参数是一个函数 {{trim?}}
[trim? ^CharSequence s]
{{trim?}}首先出现以支持部分应用。
新文档字符串将是
"从字符串的两端删除字符。
如果省略trim?,则删除空白字符。提供时,它接受
一个字符并返回一个布尔值,表示该字符应该被删除。
示例测试
(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. 函数利用字符串实现细节来
编写高效的循环/递归而不是使用高阶
函数。(这在通用应用程序
代码中并不常见。)"
最初我有一个解决方案,我用 pred 调用替换了 Character/isWhitespace 的当前实现。pred 默认为 is-whitespace? 函数。
当然,那段代码更好,trim-newline 甚至可以只调用 trimr,从而减少很多冗余,但这增加了总是调用函数的开销,而不是直接调用 Character/isWhitespace。
我能看到的最优化并且DRY的代码是使用宏,但我认为这并不一定会导致更好的代码。
鉴于 string.clj 中其他函数的现有设计样式,我觉得最佳解决方案就是简单地复制,以提高代码的优化。