【问题标题】:Is it good practice for a Clojure record to implement IFn?Clojure 记录实施 IFn 是一种好习惯吗?
【发布时间】:2012-08-11 09:46:00
【问题描述】:

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

我可以通过实现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是不是一个好习惯?

这种方法有什么陷阱吗?

【问题讨论】:

    标签: function clojure functional-programming record


    【解决方案1】:

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

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

    该记录原本是一个 Job 类,它将由工作人员处理。因此,我还实现了另一个接口java.lang.Runnable和一个run函数。

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

    worker 逻辑是这样的:

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

    但是,clojure.lang.IFn 已经扩展了CallableRunnable,所以由于我忘记实现call 函数而引发了异常。

    【讨论】:

      【解决方案2】:

      我很惊讶它还没有。记录应该是"a complete implementation of a persistent map"。因此,要回答您的问题,我希望它是其键的功能,就像地图一样;其他任何事情都会非常令人惊讶。

      【讨论】:

      • 一条记录似乎实现了clojure.lang.Associative,但不是clojure.lang.IFn。所以你可以用(:a some-record) 来查找关键字,但不能用(some-record :x)
      • 没错。我已经检查过,但没有从 Rich 那里看到任何明确的信息。也许这只是一个疏忽。
      • +1 因为@mikera 的问题询问的是记录而不是类型。因为记录已经具有类似地图的语义,所以它会令人困惑,对于类型,这个问题不存在。
      猜你喜欢
      • 2023-03-30
      • 2019-06-04
      • 2018-02-19
      • 1970-01-01
      • 2016-12-11
      • 1970-01-01
      • 2017-02-20
      • 1970-01-01
      • 2013-02-04
      相关资源
      最近更新 更多