.foo ドット短縮記法は型名を省略可能な構文です。コンパイラが文脈から対象の型を推論できる場合、より簡潔なDartコードを記述できます。列挙型の値、静的メンバー、コンストラクタにアクセスする際、型.foo を完全に記述する必要がありません。
簡単に言うと:ドット短縮記法では式を以下の形式で記述でき、後にメソッドチェーンを続けられます。
- 識別子
.myValue - コンストラクタ
.new() - 定数生成
const .myValue()
例
enum Status { none, running, stopped, paused }
class Point {
final int x, y;
Point(this.x, this.y);
Point.origin() : x = 0, y = 0;
}
void main() {
// 名前付きコンストラクタの短縮記法
Point origin = .origin(); // Point.origin() と同等
// 列挙型の短縮記法
Status currentStatus = .running; // Status.running と同等
// 静的メソッドの短縮記法
int port = .parse('8080'); // int.parse('8080') と同等
}Code language: Dart (dart)
文脈型(Context type)
ドット短縮記法は文脈型によって、コンパイラが対応する型メンバーを推論する仕組みです。
文脈型:式が記述されている場所から、Dartがこの箇所に期待するデータ型のことを指します。
例:Status currentStatus = .running
コンパイラは変数が Status 型であることを認識するため、.running を Status.running と解釈します。
字句構造と文法
静的メンバー短縮記法は. から始まる式です。文脈から型を特定可能な場合、静的メンバー、コンストラクタ、列挙定数を短縮して参照できます。
利用できる場面
1. 列挙型
代入処理やswitchによる条件分岐では列挙型が明確なため、短縮記法と相性が良いです。
enum LogLevel { debug, info, warning, error }
String colorCode(LogLevel level) {
return switch (level) {
.debug => 'gray',
.info => 'blue',
.warning => 'orange',
.error => 'red',
};
}
void main() {
// 呼び出し例
String warnColor = colorCode(.warning); // LogLevel.warning と自動判定
}Code language: Dart (dart)
2. 名前付きコンストラクタ / ファクトリコンストラクタ
ジェネリッククラスのコンストラクタに型引数を渡す処理にも対応しています。
class Point {
final double x, y;
const Point(this.x, this.y);
const Point.origin() : x = 0, y = 0;
factory Point.fromList(List<double> list) => Point(list[0], list[1]);
}
void main() {
Point origin = .origin();
Point p1 = .fromList([1.0, 2.0]);
// ジェネリッククラス
List<int> intList = .filled(5, 0); // List.filled(5,0)
}Code language: Dart (dart)
3. 引数なしコンストラクタ .new
.new はクラスのデフォルト無名コンストラクタを短縮呼び出す記法です。状態クラスのフィールドを大量に初期化する場面に適し、ジェネリック引数も自動推論されます。
// 短縮記法を使用しない場合
late final AnimationController _animationController = AnimationController(vsync: this);
final ScrollController _scrollController = ScrollController();
// 短縮記法利用後
late final AnimationController _animationController = .new(vsync: this);
final ScrollController _scrollController = .new();
final GlobalKey<ScaffoldMessengerState> scaffoldKey = .new();
Map<String, Map<String, bool>> properties = .new();Code language: Dart (dart)
4 静的メンバー(静的メソッド、静的フィールド)
int httpPort = .parse('80'); // int.parse('80')
BigInt bigIntZero = .zero; // BigInt.zeroCode language: Dart (dart)
5 定数式
定数の文脈において、参照先のメンバーがコンパイル時定数であれば短縮記法を利用可能です。
enum Status { none, running }
class Point {
final double x, y;
const Point(this.x, this.y);
const Point.origin() : x = 0.0, y = 0.0;
}
const Status defaultStatus = .running;
const Point myOrigin = .origin();
const List<Point> keyPoints = [.origin(), .new(1.0, 1.0)];Code language: Dart (dart)
メソッドチェーン
短縮記法の後にインスタンスメソッドやプロパティを連鎖呼び出しできます。コンパイラはまず文脈から短縮記法の対象を解決し、後続の連鎖呼び出しの戻り値は型互換性を満たす必要があります。
String lowerH = .fromCharCode(72).toLowerCase();
// String.fromCharCode(72).toLowerCase()
print(lowerH); // hCode language: JavaScript (javascript)
void main() {
String lowerH = .fromCharCode(72).toLowerCase();
// String.fromCharCode(72).toLowerCase()
print(lowerH); // h
}Code language: Dart (dart)
D:\dartdemo\firstdart>dart run
Building package executable...
Built firstdart:firstdart.
h
Code language: CSS (css)
Dot shorthands(ドット短縮記法)