Ein Verse Modul ist eine atomare Code-Einheit, die weiter verteilt werden kann und von der du abhängig bist und die sich im Laufe der Zeit weiterentwickeln kann, ohne Abhängigkeiten zu unterbrechen. Du kannst ein Modul in deine Verse-Datei importieren, um Code-Definitionen aus anderen Verse-Dateien zu verwenden.
Ein Verse-Modul wird durch den Ordner in der Dateihierarchie des Projekts angegeben, und der Name des Moduls ist der Name des Ordners. Alle .verse-Dateien, die sich im selben Ordner wie die Datei befinden, sind Teil dieses Verse-Moduls und können auf Definitionen aus den anderen Verse-Dateien des Moduls zugreifen, ohne das Modul explizit zu importieren.
Ein Modul wird durch seinen Pfad identifiziert, zum Beispiel /Verse.org/Verse. Verse-Pfade bieten einen globalen Namensraum zum Identifizieren von Dingen und lehnen sich an die Idee von Webdomains an. Diese Pfade sind beständig und eindeutig und können von jedem Verse-Programmierer gefunden werden.
Eine Liste der vorhandenen Verse-Module findest du in der Verse-API-Referenz.
Modulmitglieder
Du kannst mit der folgenden Syntax Module innerhalb einer .verse-Datei erstellen:
module1 := module:
...
# Ähnlich wie bei Klassen und Funktionen wird auch die Klammersyntax unterstützt.
module2 := module
{
...
}
Ein in der Verse-Datei definiertes Modul kann alles enthalten, was auf der obersten Ebene einer .verse-Datei enthalten ist. Dazu gehören Funktionen, Konstanten, verschiedene Typen sowie andere Moduldefinitionen. Zum Beispiel:
module := module:
submodule<public> := module:
submodule_class<public> := class {}
module_class<public> := class{}
Der Inhalt eines Submoduls kann mit dem Namen des Moduls qualifiziert mit dem Namen des Basismoduls referenziert werden. Beispielsweise kann auf class1 außerhalb von module1 als module1.module2.class1 verwiesen werden.
Importieren von Definitionen aus anderen Verse-Dateien
Um den Inhalt eines Verse-Moduls zu nutzen, musst du das Modul über seinen Pfad importieren. Der folgende Code importiert zum Beispiel das Modul Random, das durch den Pfad /Verse.org/Random angegeben wird:
using { /Verse.org/Random }
Wenn das Math-Modul in deine Verse-Datei importiert wird, kannst du seine Code-Definitionen verwenden, wie zum Beispiel die Funktion GetRandomInt().
Andere gängige Modulbeispiele sind die Module Devices, Simulation und Diagnostics, die alle standardmäßig importiert werden, wenn du über UEFN eine neue Verse-Datei erstellt.
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/Diagnostics }
Um Module aus anderen Verse-Dateien zu importieren, kannst du entweder einen lokalen Pfad wie using { /deinVerseOrdner/dein_Modul } verwenden oder einfach nur using { dein_Modul }, wenn sich die Datei im gleichen Verzeichnis befindet.
Du kannst verschachtelte Module importieren, indem du entweder Basismodule vor den Submodul-Modulen importierst oder indem du eine Notation mit Punkten verwendest. Zum Beispiel mit diesen gegebenen Modulen:
base_module<public> := module:
submodule<public> := module:
submodule_class := class:
...
Wenn du auf Mitglieder im submodule zugreifen möchtest, kannst du es entweder durch Importieren von base_module vor submodule oder durch Importieren von base_module.submodule importieren. Beachte, dass das Importieren von submodule vor base_module zu einem Fehler führt.
# Funktioniert und importiert Basis- und Submodule
using { base_module }
using { submodule }
# Funktioniert und importiert nur das Submodul
using { base_module.submodule }
# Funktioniert nicht
using { submodule }
using { base_module }
Wenn du einen Unterordner in einem Verse-Projekt erstellt, wird für diesen Ordner automatisch ein Modul erstellt. Wenn zum Beispiel base_module in einem Ordner module_folder definiert wurde, hätte module_folder ein eigenes Modul, das base_module enthält.
Man kann dies auch so verstehen, dass die Dateistruktur module_folder/base_module mit Folgendem identisch ist:
module_folder := module:
base_module := module:
submodule := module:
submodule_class := class:
...
Beachte, dass das Modul für module_folder vor base_module importiert werden muss.
# Importiert den Ordner, der base_module enthält, und sein Submodul
using { module_folder }
using { base_module }
using { submodule }
Zugriff auf Definitionen in einem Modul
Der Zugriff eines Moduls und seines Inhalts aus anderen Verse-Dateien wird mithilfe von Zugriffsbezeichnern wie public und internal festgelegt.
Standardmäßig ist der Zugriff für Definitionen internal, was bedeutet, dass sie nur innerhalb ihres eigenen Moduls auffindbar sind. Das gilt auch für Module, die durch Ordner in einem Projekt eingeführt wurden.
Da der Standardzugriffsbezeichner internal ist, kannst du nicht auf Modulmitglieder außerhalb des Moduls zugreifen, ohne sie öffentlich zu machen. Zum Beispiel:
# Auf dieses Modul und seine Mitglieder kann nicht aus anderen Verse-Dateien heraus zugegriffen werden.
private_module := module:
SecretInt:int = 1
...
# Bei diesem Modul, seinen Submodulen und Mitgliedern ist es aber möglich.
public_module<public> := module:
public_submodule<public> := module:
PublicInt<public>:int = 1
...
Beachte, dass sowohl das Modul als auch seine Mitglieder public sein müssen, damit in einem anderen Bereich darauf zugegriffen werden kann.