class - 不同的初始化,Common Lisp
问题描述
我可以在 CL 中模仿不同的构造函数吗?
详细说明——在 C++ 中,我可以根据传递的参数为同一个类创建不同的构造函数。
我可以用 CLOS 做到这一点吗?可能有不同initialize-instance
的 s 关键参数或类似的东西?
解决方案
一种方法是使用辅助初始化方法:
(defclass myclass ()
((s1 :initarg :s1 :accessor s1)))
(defgeneric initialize-myclass (dispatch class &key))
(defmethod initialize-instance :after ((c myclass) &rest args &key (dispatch 'normal)
&allow-other-keys)
(apply #'initialize-myclass dispatch c args))
(defmethod initialize-myclass ((dispatch (eql 'normal)) (class myclass) &key))
(defmethod initialize-myclass ((dispatch (eql 'special)) (class myclass)
&key x &allow-other-keys)
(print x))
现在你可以说
(make-instance 'myclass :dispatch 'special ...)
例如。请注意,这不一定是一种好方法,但它确实有效,而且我已经使用过。另请注意,我可能将关键字参数默认设置为错误:我不记得您需要说&allow-other-keys
的地方和不需要说的地方,以及说它的正确位置。
这里的基本问题是我们想要一个额外的东西来分派:initialize-instance
可以在被定义的对象的类上分派,但这就是它可以分派的全部。特别是它不能调度它的一个关键字参数,因为你不能在 CLOS 中这样做。但是我们可以将其关键字参数之一(dispatch
此处)作为位置参数“祝福”到辅助初始化通用函数,然后可以在该参数上调度。
推荐阅读
- c# - ElasticSearch NEST - FieldValueFactorFunction 得分函数输出无效的 json 查询
- android - 发生 Android Firebase Firestore StorageException
- postgresql - Postgres查询通过许多参数删除重复的行
- excel - 无法在 excel vba 中选择网站上的下拉列表
- react-native - 如何在本机反应中将 const 传递到其他屏幕?
- spring - Spring Integration - 无法使用 Http 入站网关处理多部分/表单数据
- codeigniter - 无法在 CodeIgniter 中获取 URL 参数
- node.js - Nestjs 启动时出现 AXIOS_INSTANCE_TOKEN 错误
- c++ - 将十进制转换为二进制结果
- windows - 将多个文件从单个源复制到不同的目标,(递归)