所以如果我有一个defclass对象,我会创建一个它的实例并将其放在一个数组中。如何在数组中获取其插槽的值?
我试过了:
(slot-value (aref *array* 0) :name)
我想我只是不了解如何访问数组中的对象。
我可以使用(格式t)以不可读的形式打印对象,但有没有办法以我能够理解的形式打印对象和所有插槽?
(defun generate-object (name)
(let ((a (make-instance 'person
:name name)))
(setf (aref *array* 0) a)))
它将对象放在数组中,但似乎没有创建插槽?
这会导致问题:
(defclass person ()
((name :accessor name
:reader read-name
:initarg :name)))
(defvar *array* 0)
(setf *array* (make-array 20))
(defun generate-object (name)
(let ((a (make-instance 'person
:name name)))
(setf (aref *array* 0) a)))
答案 0 :(得分:4)
插槽名称必须是syntactically valid as a variable name的符号。请尝试使用'name
代替:name
。
(slot-value (aref *array* 0) 'name)
查看示例here。
答案 1 :(得分:0)
尽管可能,但建议不要在低级特定于类的代码之外使用slot-value
(如initialize-instance
方法等)。
您应该在插槽中添加访问器并使用它们。例如:
(defclass foo ()
((bar :reader foo-bar
:initarg :bar)))
这定义了一个包含广告位foo
的类bar
。您可以使用:initarg
名称
(let ((my-foo (make-instance 'foo :bar "baz")))
#| whatever |#)
您可以使用定义的:reader
:
(let ((my-foo (make-instance 'foo :bar "baz")))
(foo-bar my-foo))
当然,从foo
到哪里并不重要。想象一下,你有一个数组foo-array
,里面有foo
个。要获取该数组中第四个bar
的{{1}}插槽值:
foo
如果您还想设置值,请使用(foo-bar (aref foo-array 3))
代替:accessor
插槽选项。
然后,您可以将其用作地点:
:reader