モジュールの使用
💡 お知らせ: このドキュメントはAIによって翻訳されています。表現に違和感がある場合は、原文(英語)を参照するか、翻訳にご協力ください。
すでに見てきたように、use 構文はモジュールのメンバーをローカルスコープに持ち込みます。
例えば、次のプログラムがあるとします:
mod Paint {
pub enum Color {
case Red, Green, Blue
}
pub type alias Hue = Color
pub def isWarm(c: Color): Bool =
match c {
case Color.Red => true
case Color.Green => false
case Color.Blue => false
}
}
このとき、以下の use はすべて意味を持ちます:
use Paint.Color
use Paint.Color.{Red, Green, Blue}
use Paint.Hue
use Paint.isWarm
さまざまな種類の use
Flix は、以下を含む複数の種類の use をサポートしています:
- 名前の修飾付き use:
use Paint.Color - 複数の名前の修飾付き use:
use Paint.Color.{Red, Green, Blue} - リネームを伴う修飾付き use:
use Paint.{Color => Shade} - 複数のリネームを伴う修飾付き use:
use Paint.Color.{Red => R, Green => G, Blue => B}
リネームは、1 つの名前だけをリネームする場合でも、常に波括弧の中に書きます。
注意: Flix はワイルドカードによる use をサポートしていません。
注意: use は修飾されていなければなりません。
use Paintと書くことはできませんし、書く必要もありません。PaintやListのようなトップレベルのモジュールは常にスコープ内にあります。
パッケージの use
use は、プロジェクトが依存している Flix パッケージのモジュールに到達するためにも使えます。flix.toml の中でそのパッケージに付けられた名前である mount を書き、続けて :: を書きます:
use game::Board // パッケージのトップレベルモジュール
use game::Game.Rules // ネストされたモジュール
use game::Game.Rules.players // 関数
use game::{Board, Game} // 複数のモジュール
use game::Game.Rules.{players => count} // リネームを伴う場合
:: はパッケージとその中のモジュールパスを区切るもので、モジュールパス自体はこれまでどおり . で区切ります。つまり use game::Game.Rules と書き、use game::Game::Rules とは書きません。:: の前後に空白を入れてはならず、1 つの use の中で使えるのは 1 回だけです。
パッケージを指定しない use はこれまでどおりの動作をします。use Chain.Empty は標準ライブラリに到達し、use Paint.Color は自分自身のモジュールに到達します。
注意:
::を書けるのはuseの中だけです。式の中でgame::Board.place()と書いたり、型の中でgame::Boardと書いたりすることはできません。
パッケージがどのようにマウントされるかについては、依存関係の使用 を参照してください。
use はどこに書けるのか?
Flix では、次の 3 つの場所で use を使えます:
- ファイルの先頭
- モジュールの内部
- 関数の内部
ファイルの先頭、またはモジュールの内部に書く use は、そのファイルまたはモジュールの宣言より前に書かなければなりません。
例えば:
mod A {
use Chain.Empty
use Chain.One
use Chain.Chain
use Int32.max
pub def maxValue(c: Chain[Int32]): Int32 =
match c {
case Empty => 0
case One(x) => x
case Chain(x, y) => max(maxValue(x), maxValue(y))
}
}
これは次のように書くこともできます:
mod A {
pub def maxValue(c: Chain[Int32]): Int32 =
use Chain.Empty;
use Chain.One;
use Chain.Chain;
use Int32.max;
match c {
case Empty => 0
case One(x) => x
case Chain(x, y) => max(maxValue(x), maxValue(y))
}
}
式の内部ではセミコロンが使われている点に注意してください。
デフォルトの use
Flix では、いくつかの組み込みコンストラクタが常にスコープ内にあります:
List.NilとList.ConsOption.NoneとOption.SomeResult.OkとResult.Err