Mo

Module in Crystal

1 Übung

Über Module

Module in Crystal erfüllen zwei Zwecke:

Der erste Zweck ist, einen Namensraum zu schaffen, um Namenskollisionen zu vermeiden. Er gruppiert aber auch Code, was verständlicher macht, wofür der Code gedacht ist.

Der zweite Zweck ist, Mixins zu definieren, um Code mit Typen zu teilen.

Module ähneln Klassen, aber der Hauptunterschied ist, dass sie nicht instanziiert werden können und daher keine Instanzvariablen haben.

Um ein Modul zu deklarieren, verwendest du das Schlüsselwort module, gefolgt vom Namen des Moduls.

module Foo
end

Namensraum

Ein Namensraum ist eine Möglichkeit, Code zu gruppieren. Das vermeidet Namenskonflikte und macht verständlicher, wofür der Code gedacht ist. Wenn du auf eine Konstante oder eine Klasse zugreifen willst, die in einem Namensraum liegt, verwendest du den Operator ::.

module Foo
  class Bar
  end
end

Foo::Bar.new

Als Mixin verwenden

Das kann nützlich sein, wenn zum Beispiel mehrere Klassen dieselbe „Basis“-Funktionalität brauchen oder wenn Code zwischen nicht verwandten Klassen geteilt werden soll. Oder wenn du Code zwischen Klassen teilen willst, die nichts miteinander zu tun haben.

Es gibt zwei verschiedene Möglichkeiten, ein Modul als Mixin zu verwenden: Die erste verwendet das Schlüsselwort include, die zweite das Schlüsselwort extend.

Beide Methoden machen Konstanten für den Typ verfügbar, der das Modul einbindet oder erweitert.

Include

Include macht alle Methoden im Modul als Instanzmethoden auf dem Typ verfügbar, der das Modul einbindet. Das Schlüsselwort include gehört an den Anfang des Typs, gefolgt vom Namen des Moduls.

module Foo
  def foo
    "foo"
  end
end

class Bar
  include Foo
end

Bar.new.foo # => "foo"

Extend

Extend funktioniert ähnlich wie Include, aber statt die Methoden als Instanzmethoden verfügbar zu machen, macht es sie als Klassenmethoden verfügbar. Das Schlüsselwort extend gehört an den Anfang des Typs, gefolgt vom Namen des Moduls.

module Foo
  def foo
    "foo"
  end
end

class Bar
  extend Foo
end

Bar.foo # => "foo"

Extend self

Ein typisches Muster in Crystal verwendet das Muster extend self in einem Modul. Dadurch werden alle Methoden im Modul als Klassenmethoden auf dem Modul selbst verfügbar. Das heißt, du musst nicht jede Methode mit der Syntax def self.method_name dem Modul zuweisen.

module Foo
  extend self

  def foo
    "foo"
  end
end

Foo.foo # => "foo"
Über GitHub bearbeiten Der Link öffnet sich in einem neuen Fenster oder Tab

Lerne Module

Das Üben ist gesperrt

Schalte 2 weitere Übungen frei, um Module zu üben