Domanda

sto formando una classe per alcuni lavori sulla dinamica molecolare come segue:

(defclass %atom (particle)
  ((name :initarg :name :initform (error "Every atom in the system must have a name!"))
   (mass :accessor mass :initarg :mass :initform (getmass name))
   (charge :accessor charge :initarg :charge :initform (getcharge name))))

Inizialmente ho pensato che avrei potuto in qualche modo riferimento ad altri slot all'interno della definizione di classe con una initform vale a dire (nome getmass) - ma che si rivela essere falso (o lo fa?!?). Invece, mi hanno detto che l'inizializzazione istanza sarebbe il posto per mettere tutta quella roba di inizializzazione ... abbastanza giusto.

La domanda che mi sono, poi, è quando è: initform utilizzato? Qual è la preferenza idiomatica? L'ho visto usato come sopra per la generazione (errore "...") del codice, e anche per inizializzare argomenti di default quando un: initarg non è prevista. Ma entrambi questi potrebbe essere facilmente inserita in inizializzazione-istanza e possono avere più senso lì. C'è un modo particolare:? Initform è generalmente utilizzato

È stato utile?

Soluzione

Di solito si potrebbe usare: initform per dare uno slot per un certo valore di default. Con defclass non si può calcolare initforms semplicemente sulla base di altri slot. Ci sono anche altre complicazioni, quindi: initform deve essere utilizzato per le forme semplici

.

Esempi

  • impostare la fessura z di un oggetto 3D-vettoriale per 0.0

  • impostare l'elenco delle finestre in un oggetto di schermo per NIL

  • impostare la fessura 'funzione di chiave' in un oggetto da # 'identità

  • impostare la fessura 'rapporto stringa' un errore di "Errore"

Qualsiasi altro più complicato insieme da valori di slot dovrebbe essere fatto in un metodo. Se l'oggetto deve essere impostato automaticamente dopo TRUCCO GRADO utilizzare un:. Dopo che il metodo per inizializzare-GRADO

Altri suggerimenti

A complicare le cose un po 'più avanti, c'è anche l'opzione class : default-initargs .

Personalmente uso :default-initargs e :initform come collegamenti quando non è necessaria la potenza di un post-metodo per initialize-instance e :initform quando l'area non ha un :initarg.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top