Mó

Módulos en Crystal

1 ejercicio

Acerca de Módulos

Los módulos en Crystal tienen dos propósitos:

El primero es crear un espacio de nombres para evitar colisiones de nombres. Sin embargo, también agrupa código, lo que facilita entender para qué sirve ese código.

El segundo es definir mixins para compartir código entre tipos.

Los módulos son similares a las clases, pero la principal diferencia es que no se pueden instanciar y, por tanto, no tienen variables de instancia.

Para declarar un módulo, usas la palabra clave module seguida del nombre del módulo.

module Foo
end

Espacio de nombres

Un espacio de nombres es una forma de agrupar código. Esto evita conflictos de nombres y facilita entender para qué sirve el código. Cuando quieres acceder a una constante o a una clase que se ha colocado dentro de un espacio de nombres, usas el operador ::.

module Foo
  class Bar
  end
end

Foo::Bar.new

Usarlo como mixin

Esto puede ser útil cuando, por ejemplo, varias clases necesitan la misma funcionalidad «base» o cuando hay que compartir código entre clases no relacionadas. O cuando quieres compartir código entre clases que no están relacionadas.

Hay dos formas distintas de usar un módulo como mixin: la primera es usar la palabra clave include y la segunda, la palabra clave extend.

Ambos métodos hacen que las constantes estén disponibles para el tipo que incluye o extiende el módulo.

Include

Include hace que todos los métodos del módulo estén disponibles como métodos de instancia en el tipo que incluye el módulo. La palabra clave include debe ir al principio del tipo, seguida del nombre del módulo.

module Foo
  def foo
    "foo"
  end
end

class Bar
  include Foo
end

Bar.new.foo # => "foo"

Extend

Extend funciona de forma similar a include, pero en lugar de hacer que los métodos estén disponibles como métodos de instancia, los hace disponibles como métodos de clase. La palabra clave extend debe escribirse al principio del tipo, seguida del nombre del módulo.

module Foo
  def foo
    "foo"
  end
end

class Bar
  extend Foo
end

Bar.foo # => "foo"

Extend self

Un patrón típico en Crystal usa el patrón extend self en un módulo. Esto hace que todos los métodos del módulo estén disponibles como métodos de clase en el propio módulo. Esto significa que no tienes que asignar cada método al módulo usando la sintaxis def self.method_name.

module Foo
  extend self

  def foo
    "foo"
  end
end

Foo.foo # => "foo"
Editar en GitHub El enlace se abre en una nueva ventana o pestaña

Aprende Módulos

La práctica está bloqueada

Desbloquea 2 ejercicios más para practicar Módulos