【问题标题】:clojure defrecord named parameters?clojure defrecord 命名参数?
【发布时间】:2011-08-23 00:16:57
【问题描述】:

defrecord 支持命名参数吗?即,如果我有这样的事情:

(defrecord Person [name age])

我可以这样做吗:

(Person. {:age 99 :name "bob"})
(Person. :age 99 :name "bob")

我通过谷歌搜索看到的唯一内容是这样的:

(Person. "bob" 99)

这似乎不太清楚......

【问题讨论】:

标签: clojure


【解决方案1】:

不是内置的,但你可以使用类似的东西:

(defmulti make-instance (fn [class & rest] class))
(defmacro defrecord* [record-name fields]
  `(do
    (defrecord ~record-name ~fields)
    (defmethod make-instance (quote ~record-name) [_# & {:keys ~fields}]
      (new ~record-name ~@fields))))
(defrecord* Person [name age])
(make-instance 'Person :age 99 :name "bob")

不确定这对你想要的东西有多合适。

【讨论】:

    【解决方案2】:

    看起来 clojure 还不支持这个?

    http://david-mcneil.com/post/765563763/enhanced-clojure-records

    【讨论】:

      【解决方案3】:

      目前没有。

      但是您可以忘记命名参数并使用扩展映射:

      (defrecord Person [])
      
      (Person. nil {:age 99 :name "bob"})
      

      当您有大量可能的字段时,我个人认为这是使用记录的最简单方法。

      【讨论】:

      • 谢谢,我会将此标记为正确答案,因为它似乎是最合理的解决方法。
      猜你喜欢
      • 2011-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-03
      • 2011-08-13
      • 1970-01-01
      相关资源
      最近更新 更多