Pular para o conteúdo

slots

Restringir os campos de uma instância — e gastar 64% menos memória por objeto.

slots declara todos os campos que uma instância pode ter. Quem tenta criar outro é recusado:

dataforge
blueprint Ponto:
    slots x, y

    action setup(x, y):
        self.x := x
        self.y := y

p := spawn Ponto(1, 2)
out p.x                  // imprime 1
p.z := 3                 // erro: 'Ponto' has no field 'z'
saída
erro[DF0402]: 'Ponto' has no field 'z'.
  = nota: it declares slots: x, y
  = dica: slots list every field the object may have; add it there,
          or remove the 'slots' declaration

Por que isso economiza memória#

Sem slots, cada instância carrega um vault com os seus campos — e um vault guarda as chaves, a tabela de espalhamento e o espaço vago que ela precisa para não colidir. Com slots, a linguagem sabe de antemão quais campos existem e em que ordem, e guarda só os valores, numa lista.

São 64% menos memória por objeto, medido. Num programa com um milhão de instâncias, é a diferença entre caber e não caber.

Herança#

Herdar de um blueprint com slots e acrescentar os próprios é o caso normal: os campos se somam.

dataforge
blueprint Ponto:
    slots x, y

blueprint Ponto3D extends Ponto:
    slots z
    // a instância aceita x, y e z

`slots` é contextual, não reservada#

O parser só a reconhece dentro de um blueprint e quando o que vem depois confirma. slots := 3 em qualquer lugar continua sendo uma variável chamada slots — pelo mesmo motivo de get, set, final e as dez palavras do Kiln: são nomes bons demais para tirar de quem escreve.