Verse の モジュール は、再配布して利用でき、依存関係 を壊さなくても経時的に進化するコードのアトミック ユニットです。Verse ファイルにモジュールをインポートすることにより、他の Verse ファイルのコード 定義 を使用できます。
Verse のモジュールは、プロジェクトのファイル階層の フォルダ によって指定され、モジュールの名前がフォルダの名前になります。.verse ファイルはすべて Verse モジュールの一部であり、モジュールを明示的にインポートしなくてもモジュール内の他の Verse ファイルから定義にアクセスできます。
モジュールは、「/Verse.org/Verse」などの パス で識別されます。Verse のパスは、対象を識別するためのグローバル名前空間を提供し、Web ドメインからアイデアを借ります。これらのパスは永続的で一意なものであり、Verse のすべてのプログラマーが検出できます。
既存の Verse モジュールのリストは、Verse API リファレンス を参照してください。
モジュール メンバー
次の構文を使用して .verse ファイル内にモジュールを作成できます。
module1 := module:
...
# クラスや関数と同じように、括弧構文もサポートされます。
module2 := module
{
...
}
Verse ファイルで定義されるモジュールには、.verse ファイルのトップ レベルに含まれるあらゆるものを含めることができます。これには、関数の定義、定数の定義、さまざまな 型 の定義、他のモジュールの定義などがあります。たとえば、次のようになります。
module := module:
submodule<public> := module:
submodule_class<public> := class {}
module_class<public> := class{}
サブモジュールのコンテンツは、ベース モジュールの名前で修飾されたモジュール名を使用して参照できます。たとえば class1 は、module1.module2.class1 として module1 の外部で参照できます。
他の Verse ファイルから定義をインポートする
Verse モジュールのコンテンツを使用するには、パスによってモジュールをインポートする必要があります。たとえば次のコードでは、パス「/Verse.org/Random」で識別された Random モジュールがインポートされます。
using { /Verse.org/Random }
Verse ファイルに Random モジュールがインポートされると、関数 GetRandomInt() などのコード定義を使用できます。
他の共通するモジュールの例としては、Devices、Simulation、および Diagnostics モジュールなどがありますが、これらはすべて UEFN から Verse ファイルを作成するとデフォルトでインポートされます。
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/Diagnostics }
他の Verse ファイルからモジュールをインポートするには、using { /YourVerseFolder/your_module } などのローカル パスを使用するか、ファイルが同じディレクトリにある場合は単に using { your_module } を使用します。
ネスティングされているモジュールは、サブモジュールよりも前にベース モジュールをインポートするか、またはドットによる表記を使用することでインポートできます。たとえば、以下のモジュールがあったとします。
base_module<public> := module:
submodule<public> := module:
submodule_class := class:
...
submodule のメンバーにアクセスする場合は、submodule よりも前に base_module をインポートするか、または base_module.submodule をインポートします。なお、base_module よりも前に submodule をインポートすると、エラーが発生します。
# 正しく機能し、ベースとサブモジュールの両方がインポートされます
using { base_module }
using { submodule }
# 正しく機能し、サブモジュールのみがインポートされます
using { base_module.submodule }
# 機能しません
using { submodule }
using { base_module }
Verse プロジェクト内でサブフォルダを作成すると、そのフォルダに対してモジュールが自動的に作成されます。たとえば、base_module がフォルダ「module_folder」で定義された場合は、module_folder に base_module を含む独自のモジュールが存在しているはずです。
これを確認する別の方法は、ファイル構造 module_folder/base_module が次と同じになっているのを確認することです。
module_folder := module:
base_module := module:
submodule := module:
submodule_class := class:
...
module_folder のモジュールは、base_module よりも前にインポートされる必要があります。
# base_module およびそのサブモジュールを含むフォルダをインポートします
using { module_folder }
using { base_module }
using { submodule }
モジュール内の定義のアクセス
他の Verse ファイルからのモジュールとそのコンテンツのアクセスは、public や internal などの アクセス指定子 を使用して設定されます。
デフォルトでは、定義のアクセスは internal になっており、そのモジュール内でしか検出できません。これは、プロジェクト内のフォルダによって導入されたモジュールについても同様です。
デフォルトのアクセス指定子は internal であるため、モジュール メンバーを公開しないかぎり、モジュール外でモジュール メンバーにアクセスすることはできません。たとえば、以下の例があります。
# 以下のモジュールと、そのメンバーは他の Verse ファイルからアクセスできません。
private_module := module:
SecretInt:int = 1
...
# しかし、以下のモジュール、そのサブモジュール、およびそのメンバーはアクセスできます。
public_module<public> := module:
public_submodule<public> := module:
PublicInt<public>:int = 1
...
モジュールとそのメンバーの両方が異なるスコープにアクセスするには、public である必要があります。