【问题标题】:Calling apply with a defrecord constructor?使用 defrecord 构造函数调用 apply?
【发布时间】:2023-04-08 05:14:01
【问题描述】:
core=> (defrecord Puffball [id name])
core.Puffball
core=> (Puffball. 149 "Urist")
#core.Puffball{:id 149, :name "Urist"}
core=> (apply Puffball. [149 "Urist"])
CompilerException java.lang.RuntimeException: java.lang.ClassNotFoundException: Puffball., compiling:(NO_SOURCE_PATH:3)
core=> (apply Puffball [149 "Urist"])
ClassCastException java.lang.Class cannot be cast to clojure.lang.IFn  clojure.core/apply (core.clj:600)

如何从向量创建马勃球?

【问题讨论】:

    标签: constructor clojure


    【解决方案1】:

    在 Clojure 1.3 中,记录定义自动引入了工厂函数:

    Clojure 1.3.0
    user=> (defrecord Puffball [id name])
    user.Puffball
    user=> (apply ->Puffball [149 "Urist"])
    #user.Puffball{:id 149, :name "Urist"}
    

    ->Puffball 是“位置”工厂函数;还有map->Puffball,顾名思义。

    【讨论】:

      【解决方案2】:

      对于那些不在 1.3.x 上(或需要记录之外的此类功能)的人,以下使用 java 方法和构造函数模拟 apply:

      (定义宏应用j ([mc args] `(~mc ~@args)) ([mc x args] `(~mc ~x ~@args)) ([mc x y args] `(~mc ~x ~y ~@args)) ([mc x y z args] `(~mc ~x ~y ~z ~@args))) user=> (defrecord Puffball [id name]) 用户.Puffball user=> (applyj Puffball. [149 "Urist"]) #:user.Puffball{:id 149, :name "Urist"}

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-03-22
        • 2012-10-08
        • 1970-01-01
        • 2011-12-01
        • 1970-01-01
        • 2011-07-12
        • 2011-04-16
        • 2021-11-23
        相关资源
        最近更新 更多