如何访问存储在数组中的类对象?

时间:2014-03-10 17:13:37

标签: arrays lisp common-lisp

所以如果我有一个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)))

2 个答案:

答案 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