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

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top