在代码中有一些地方,我需要定义和使用一次的函数,在定义它们的地方定义。定义此类函数有两种主要方法,一种是无名函数
(map #(blepify-with blep (:blop %)) xs)
另一种是高阶函数
(map (comp (partial blepify-with blep) :blop) xs)
我个人不使用partial
,总是倾向于使用匿名函数,因为
- 匿名函数在调用时进行变量解引用,这意味着我可以重新定义
blepify-with
,新定义将自动使用。在开发期间非常有帮助,并且与直接链接一样在生产中表现良好;
partial
通过隐藏函数参数数量,使得代码的可读性降低。明确比隐晦好,Cursive可以立即显示我是否传递了错误的函数参数数量
我也很少使用comp
。除了上面提到的变量解引用外,它还让我从右到左阅读代码。在小示例中这并不重要,但随着示例的扩大,线程宏极大地提高了可读性。
我发现comp
有用的唯一情况是当数据处理顺序与函数应用顺序相反时,如transducers:(comp (filter even?) (map inc))
应该从左到右读取。尽管首先调用的是(map inc)
,但这个transducer处理的数据首先通过even?
谓词,然后通过inc
转换。
我的问题是,我是否错过了关于partial
和comp
的更多内容?也许这只是口味的问题,我只是不习惯用它们,而且它们同样易于阅读,而且不必重新定义使用位置的优点被高估了?我应该何时更倾向于使用comp
和partial
而不是匿名函数?