Quando é um initForm usado?
-
18-09-2019 - |
Pergunta
Eu estou formando uma classe para algum trabalho em dinâmica molecular da seguinte forma:
(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))))
Inicialmente eu pensei que eu pudesse de alguma forma se referir a outros slots dentro da definição de classe com um initForm ou seja, (nome getmass) - mas que acaba por ser falso (ou não é?!?). Em vez disso, me disseram que inicializar instância seria o lugar para colocar tudo o que a inicialização coisas ... justo.
A pergunta que eu tenho, então, é quando é: initForm usado? Qual é a preferência idiomática? Eu já vi isso usado como acima para gerar (erro "...") código, e também para inicializar argumentos padrão quando um: INITARG não é fornecido. Mas tanto daqueles poderia facilmente se encaixam em initialize instância e pode fazer mais sentido lá. Existe uma maneira especial:? InitForm é geralmente usado
Solução
Normalmente, pode-se usar: initForm para dar um slot algum valor padrão. Com um DEFCLASS pode initforms não computação simplesmente com base em outros slots. Há também outras complicações, então: initForm deve ser usado para formas simples
.Exemplos
-
definir a ranhura z de um objecto 3D-vector a 0,0
-
definir a lista de janelas em um objeto de tela para NIL
-
definir o slot de 'função chave' em um objeto para # "identidade
-
definir o slot 'string relatório em um erro de "um erro ocorreu"
Qualquer outro mais complicado configurar de valores de slot deve ser feito em um método. Se as necessidades do objeto a ser criado automaticamente após o uso MAKE-INSTÂNCIA um:. APÓS método para inicializar-INSTÂNCIA
Outras dicas
Para coisas complicar um pouco mais, há também a opção de classe : default-initargs .
Pessoalmente eu uso :default-initargs
e :initform
como atalhos quando não é necessário todo o poder de um-método depois de initialize-instance
e :initform
quando o slot não tem um :initarg
.