如何实现cl-print-object?EIEIO对象调试显示方法咨询
解决EIEIO中
cl-print-object的实现与edebug查看对象问题 一、正确实现cl-print-object方法
首先要明确:cl-print-object的参数逻辑和已过时的object-print不同,它的第二个参数是输出流,而非字符串列表,之前的写法存在参数误用问题。以下是正确的实现方式:
针对card类的具体实现
(cl-defmethod cl-print-object ((obj card) stream) "自定义card对象的打印格式,方便在edebug中查看" (print-unreadable-object (obj stream :type t) (format stream "value: %s" (slot-value obj 'value))))
print-unreadable-object是CL/EIEIO提供的标准宏,用于生成对象的可读打印格式;:type t会自动带上对象的类名,最终输出类似#<card value: xxx>的格式- 第二个参数
stream是输出流,所有打印内容要通过它输出,而非直接返回字符串 - 如果原本想用自定义的
render方法,只要确保该方法已正确定义,就可以替换(slot-value obj 'value)为(render obj),比如先定义通用的render方法再实现具体类的逻辑:
;; 先定义通用render方法 (cl-defgeneric render (obj) "返回对象的可读字符串表示") ;; 给card类实现render (cl-defmethod render ((obj card)) (slot-value obj 'value)) ;; 此时cl-print-object可以改成 (cl-defmethod cl-print-object ((obj card) stream) "自定义card对象的打印格式" (print-unreadable-object (obj stream :type t) (format stream "value: %s" (render obj))))
针对data-object类的通用实现
如果要给父类data-object做通用打印逻辑,写法类似:
(cl-defmethod cl-print-object ((obj data-object) stream) "自定义data-object对象的打印格式" (print-unreadable-object (obj stream :type t) (format stream "value: %s" (render obj))))
二、edebug中查看EIEIO对象的实用技巧
除了自定义打印方法,还有几种更直接的方式查看对象内容:
- 在edebug调试界面,把光标移到对象变量上,按
C-x C-e(eval-last-sexp),会自动调用你定义的cl-print-object输出对象的格式化内容 - 使用
eieio-describe-object命令:选中对象变量后调用该命令,会弹出专门的缓冲区,展示对象的所有槽位及其对应值,信息最完整 - 临时查看单个槽的值:直接在edebug的表达式输入区执行
(slot-value obj 'slot-name),替换slot-name为你要查看的槽名称即可
内容的提问来源于stack exchange,提问作者gdonald
相关产品推荐
相关产品推荐

