Function Clojure记录实施IFn是否是一种良好的做法?
假设我有一个“类似函数”的记录,至少在某种意义上,它表示可以应用于某些参数的操作 我可以通过实现Function Clojure记录实施IFn是否是一种良好的做法?,function,clojure,functional-programming,record,Function,Clojure,Functional Programming,Record,假设我有一个“类似函数”的记录,至少在某种意义上,它表示可以应用于某些参数的操作 我可以通过实现clojure.lang.IFn使其作为一个函数工作,类似于: (defrecord Func [f x] clojure.lang.IFn (invoke [this arg] (f x arg)) (applyTo [this args] (apply f x args))) ((->Func + 7) 1) => 8 (是的,我知道
clojure.lang.IFn
使其作为一个函数工作,类似于:
(defrecord Func [f x]
clojure.lang.IFn
(invoke [this arg]
(f x arg))
(applyTo [this args]
(apply f x args)))
((->Func + 7) 1)
=> 8
(是的,我知道我刚刚重新实现了partial
…这只是一个例子:-)的低级版本
制作一个记录工具clojure.lang.IFn
是否是一个好的做法
这种方法有什么缺陷吗?我很惊讶它还没有。记录应该是。所以要回答你的问题,我希望它是它的键的函数,就像地图一样;其他任何事情都会让人惊讶。我不能直接回答是/否,但我可以分享我的经验 我定义了一个实现的记录
clojure.lang.IFn
。实现IFn是为了让我能够轻松地通过REPL环境进行测试
该记录旨在成为一个作业类,由一名工人处理。因此,我还实现了另一个接口java.lang.Runnable
和run
函数
当我真的将代码放入集成测试时,它抛出了异常。为什么?
工人逻辑是这样的:
调用
函数Runnable
实例,如果是,则调用run
函数但是,
clojure.lang.IFn
已经扩展了Callable
和Runnable
,因此引发了异常,因为我忘了实现call
函数。一条记录似乎实现了clojure.lang.Associative
而不是clojure.lang.IFn
。因此,您可以执行(:a some record)
来查找关键字,但不能精确地查找(some record:x)
。我查过了,但没有看到Rich对此有任何明确的解释。也许这只是一个疏忽。+1的给出是因为@mikera的问题是关于记录而不是类型的。因为记录已经有了类似于映射的语义,这会让人困惑,因为对于类型来说,这个问题并不存在。