例如,我有一个简单的记录定义
(defrecord User [name email place])
Run Code Online (Sandbox Code Playgroud)
在序列中创建记录值的最佳方法是什么?
(def my-values ["John" "john@example.com" "Dreamland"])
Run Code Online (Sandbox Code Playgroud)
我希望有类似的东西
(apply User. my-values)
Run Code Online (Sandbox Code Playgroud)
但那不行.我最终做了:
(defn make-user [v]
(User. (nth v 0) (nth v 1) (nth v 2)))
Run Code Online (Sandbox Code Playgroud)
但我感觉有一些更好的方法来实现这一目标......
警告:仅适用于字面序列!(参见 Miha\xc5\x82\ 的评论)
\n\n试试这个宏:
\n\n(defmacro instantiate [klass values] \n `(new ~klass ~@values))\nRun Code Online (Sandbox Code Playgroud)\n\n如果您将其扩展为:
\n\n(macroexpand \'(instantiate User ["John" "john@example.com" "Dreamland"]))
你会得到这个:
\n\n(new User "John" "john@example.com" "Dreamland")
这基本上就是你所需要的。
\n\n您可以使用它来实例化其他记录类型或 Java 类。基本上,这只是一个类构造函数,它采用一个参数序列而不是多个参数。
\n| 归档时间: |
|
| 查看次数: |
963 次 |
| 最近记录: |