common-lisp
CLOS 메타 객체 프로토콜
수색…
클래스의 슬롯 이름을 얻습니다.
우리는 수업을 다음과 같이 말합니다.
(defclass person ()
(name email age))
클래스의 슬롯 이름을 얻으려면 class-slots 함수를 사용합니다. 이것은 클로이 샵 시스템 (close-mop system)에 의해 제공되는 클로이 모프 (close-mop) 패키지에서 찾을 수 있습니다. 우리가 사용하는 실행중인 lisp 이미지를로드하려면 (ql:quickload :closer-mop)
. 클래스 슬롯을 호출하기 전에 클래스가 마무리되었는지도 확인해야합니다.
(let ((class (find-class 'person)))
(c2mop:ensure-finalized class)
(c2mop:class-slots class))
유효 슬롯 정의 객체 목록을 반환합니다.
(#<SB-MOP:STANDARD-EFFECTIVE-SLOT-DEFINITION S/TRANSFORMATIONS::NAME>
#<SB-MOP:STANDARD-EFFECTIVE-SLOT-DEFINITION S/TRANSFORMATIONS::EMAIL>
#<SB-MOP:STANDARD-EFFECTIVE-SLOT-DEFINITION S/TRANSFORMATIONS::AGE>)
다른 슬롯이 수정되면 슬롯 업데이트
CLOS MOP는 슬롯에 값이 액세스, 읽기 또는 수정 될 때 호출되는 후크 슬롯 - 값 - 사용 - 클래스를 제공합니다. 이 경우에는 수정 (setf slot-value-using-class)
때문에 (setf slot-value-using-class)
대한 메소드를 정의합니다.
(defclass document ()
((id :reader id :documentation "A hash computed with the contents of every other slot")
(title :initarg :title :accessor title)
(body :initarg :body :accessor body)))
(defmethod (setf c2mop:slot-value-using-class) :after
(new class (object document) (slot c2mop:standard-effective-slot-definition))
;; To avoid this method triggering a call to itself, we check that the slot
;; the modification occurred in is not the slot we are updating.
(unless (eq (slot-definition-name slot) 'id)
(setf (slot-value object 'id) (hash-slots object))))
인스턴스 생성 slot-value
가 호출되지 않기 때문에 initialize-instance :after
메소드에서 코드를 복제해야 할 수도 있습니다
(defmethod initialize-instance :after ((obj document) &key)
(setf (slot-value obj 'id)
(hash-slots obj)))
Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow