16

假设我有一个“类似函数”的记录,至少在它代表可以应用于某些参数的操作的意义上。

我可以通过实现来使它作为一个函数工作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一种好的做法吗?

这种方法有什么陷阱吗?

4

2 回答 2

6

我很惊讶它还没有。记录应该是“持久映射的完整实现”。因此,要回答您的问题,我希望它是其键的功能,就像地图一样;其他任何事情都会非常令人惊讶。

于 2012-08-15T05:24:31.740 回答
0

我不能直接给出是/否的答案,但我可以分享我的经验。

我定义了一个实现的记录clojure.lang.IFn。实现 IFn 是为了让我可以轻松地通过 REPL 环境对其进行测试。

该记录旨在成为 Job 类,将由工作人员处理。因此,我还实现了另外一个接口java.lang.Runnable和一个run函数。

当我真正将代码放入集成测试时,它抛出了异常。为什么?

工人逻辑是这样的:

  1. 它检查 Job 类是否是一个Callable实例,如果是,则调用该call函数。
  2. 它检查 Job 类是否是一个Runnable实例,如果是,则调用该run函数。

但是,clojure.lang.IFn已经扩展了Callableand Runnable,所以由于我忘记实现该call功能而引发了异常。

于 2021-02-18T06:46:55.197 回答