Mó

Módulos em Crystal

1 exercício

Sobre Módulos

Os Módulos em Crystal têm dois propósitos:

O primeiro propósito é criar um namespace para evitar colisões de nomes. Além disso, ele também agrupa código, o que facilita entender para que o código serve.

O segundo propósito é definir mixins para compartilhar código entre tipos.

Módulos são parecidos com classes, mas a principal diferença é que não podem ser instanciados e, por isso, não têm variáveis de instância.

Para declarar um módulo, você usa a palavra-chave module seguida do nome do módulo.

module Foo
end

Namespace

Um namespace é uma forma de agrupar código. Isso evita colisões de nomes e facilita entender para que o código serve. Quando você quer acessar uma constante ou uma classe que foi colocada dentro de um namespace, usa o operador ::.

module Foo
  class Bar
  end
end

Foo::Bar.new

Usar como mixin

Isso pode ser útil quando, por exemplo, várias classes precisam da mesma funcionalidade "básica", ou quando código precisa ser compartilhado entre classes sem relação. Ou quando você quer compartilhar código entre classes que não têm relação.

Há duas formas diferentes de usar um módulo como mixin: a primeira é usar a palavra-chave include, e a segunda é usar a palavra-chave extend.

Os dois métodos tornam as constantes disponíveis para o tipo que inclui ou estende o módulo.

Include

O include deixa todos os métodos do módulo disponíveis como métodos de instância no tipo que inclui o módulo. A palavra-chave include deve ficar no topo do tipo, seguida do nome do módulo.

module Foo
  def foo
    "foo"
  end
end

class Bar
  include Foo
end

Bar.new.foo # => "foo"

Extend

O extend funciona de forma parecida com o include, mas, em vez de deixar os métodos disponíveis como métodos de instância, deixa-os disponíveis como métodos de classe. A palavra-chave extend deve ser escrita no topo do tipo, seguida do nome do módulo.

module Foo
  def foo
    "foo"
  end
end

class Bar
  extend Foo
end

Bar.foo # => "foo"

Extend self

Um padrão típico em Crystal usa o padrão extend self em um módulo. Isso deixa todos os métodos do módulo disponíveis como métodos de classe no próprio módulo. Isso significa que você não precisa atribuir cada método ao módulo usando a sintaxe def self.method_name.

module Foo
  extend self

  def foo
    "foo"
  end
end

Foo.foo # => "foo"
Editar via GitHub O link abre em uma nova janela ou aba

Aprenda Módulos

A prática está bloqueada

Desbloqueie mais 2 exercícios para praticar Módulos