2
respostas

Dúvida sobre this em defprotocol Carregavel

Não entendi o "this" em "defprotocol Carregavel" sendo que ele parece nunca ser usado.

2 respostas

Oii, Alessandro.

Em Clojure, quando você define um protocolo com defprotocol, ele cria uma espécie de "contrato" que tipos podem implementar. Dentro das funções do protocolo, o primeiro parâmetro é sempre a referência ao objeto que implementa aquele protocolo, por convenção, é chamado de this, mas poderia ter qualquer nome.

Por exemplo:

(defprotocol Carregavel
  (carregar [this peso]))

(defrecord Mochila [capacidade]
  Carregavel
  (carregar [this peso]
    (println "Carregando" peso "kg na mochila de capacidade" (:capacidade this) "kg")))

Repare que em (carregar [this peso] ...), o this representa a instância concreta de Mochila que está usando o protocolo. Assim, podemos acessar os campos dela normalmente com (:capacidade this).

Ao usar:

(def minha-mochila (->Mochila 30))

(carregar minha-mochila 10)

A saída será:

Carregando 10 kg na mochila de capacidade 30 kg

Ou seja, o this é como o self no Python ou this em Java, serve para acessar os dados da instância que está executando o método do protocolo.

Se puder dizer qual curso e aula está fazendo, posso te ajudar melhor.

Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!

Mas na implementação dele, ele não usa o this dentro da função "carrega!".