はじめに
Flutter に入門してみて、Dart は他のプログラミング言語をやったことがあれば、読むのは苦労しなそうでした。
とはいえ、以下の Introduction to Dart で基本はさらっておこうと思います。
少し長いため2回に分けます。
想定読者
プログラミング言語自体はいくつか触ったことがあるが、Dartは初めての人。
Dart とは?
Google によって開発されたプログラミング言語です。
ウェブアプリやモバイルアプリのクライアント開発向けに設計され、サーバーやデスクトップ向けアプリケーションの開発にも使用できます。
Flutter で利用されていることで注目されていますね。
Dart の特徴として、公式サイトでは以下を挙げています。
- 親しみやすさ
一貫性があり、簡潔で、型が強いプログラミング言語。
モダンな機能として、Null Safety(ヌル安全)やパターンマッチングをサポートしているので、直感的かつ安全に開発を進められる。 - 生産性の高い開発
ホットリロード機能を活用して、アプリを実行中でもコードを変更して即座に結果を確認できる。
これにより、反復的な開発サイクルが高速化される。 - 全てのプラットフォームでの高速性と移植性
モバイル、デスクトップ、バックエンド向けには、ARM、x64、RISC-Vのネイティブコードにコンパイル可能。
また、Web向けにはJavaScriptやWebAssemblyにコンパイルすることで、幅広いプラットフォームに対応。
Introduction to Dart
では、早速みていきたいと思います。
DartPad を使えば、Web上で実行することができます。
Hello World
基本の Hello World からです。
実行の開始として、お馴染みの void main()
を使います。
void main() {
print('Hello, World!');
}
実行結果
Hello, World!
Variables
基本的に方は省略可能
Dart は型安全ですが、var
を使って型推論ができます。
var name = 'Voyager I';
var year = 1977;
var antennaDiameter = 3.7;
var flybyObjects = ['Jupiter', 'Saturn', 'Uranus', 'Neptune'];
var image = {
'tags': ['saturn'],
'url': '//path/to/saturn.jpg'
};
型を指定する場合
String name = 'Voyager I';
int year = 1977;
double antennaDiameter = 3.7;
List<String> flybyObjects = ['Jupiter', 'Saturn', 'Uranus', 'Neptune'];
Map<String,Object> image = {
'tags': ['saturn'],
'url': '//path/to/saturn.jpg'
};
型も馴染みのあるものが多いですね。
Nullable (ヌル許容)
?
をつけることで、Nullableを指定できます。
void main() {
String name;
String? address;
print(name);
print(address);
}
非Nullable の値を設定前に使うと以下のようにコンパイル時にエラーとなります。
初期化の遅延
late
を付けると初期化を遅延できます。
通常、使用前までに初期化していれば、エラーにならないが、トップレベルで宣言した場合など、使用前に初期化していてもコンパイルエラーになってしまうケースがあります。
その場合は、late
を付けることでエラーを抑止できます。
late String description;
void main() {
description = 'Feijoada!';
print(description);
}
ただし、late
を付けて初期化を忘れて利用してしまうと、実行時エラーになってしまいます。
DartPad caught unhandled LateError:
LateInitializationError: Field 'description' has not been initialized.
final と const
final => 1度だけセットできる
const => コンパイル時に評価される
両方とも、var
の代わりに利用するか、型の前につけて使うことができます。
void main() {
final finalVal;
// const は初期化時に設定
const String constVal = "def";
// final は後から設定できる
finalVal = "abc";
// 2回設定しようとするとコンパイルエラー
//finalVal = "abc2";
print(finalVal);
print(constVal);
}
Control flow statements
if
での条件分岐、for
や while
でのループは Dart でも使えます。
使い方も変わったところはなさそうです。
if (year >= 2001) {
print('21st century');
} else if (year >= 1901) {
print('20th century');
}
for (final object in flybyObjects) {
print(object);
}
for (int month = 1; month <= 12; month++) {
print(month);
}
while (year < 2016) {
year += 1;
}
Functions
Functon
も特に難しい部分はなさそうですね。
戻り値の型を省略できますが、指定するのが推奨だそうです。
int fibonacci(int n) {
if (n == 0 || n == 1) return n;
return fibonacci(n - 1) + fibonacci(n - 2);
}
void main() {
print(fibonacci(20));
}
1行しか無い場合は、=>
を使った省略形で Function
を定義できます。
flybyObjects.where((name) => name.contains('turn')).forEach(print);
コメント
//
///
/* */
の3種類のコメントがあります。
// 通常の一行コメント
/// ドキュメンテーション用のコメント
/// IDEやDartdocでドキュメントコメントとして扱われる
/* 開始と終端を指定するタイプのコメント */
Import
別ライブラリで定義されたAPIは import
文でインポートします。
// Importing core libraries
import 'dart:math';
// Importing libraries from external packages
import 'package:test/test.dart';
// Importing files
import 'path/to/my_other_file.dart';
Class
class Spacecraft {
String name;
DateTime? launchDate;
// Read-only non-final property
int? get launchYear => launchDate?.year;
// コンストクタ:this.name のように指定することで、メンバ変数に設定することができる
Spacecraft(this.name, this.launchDate) {
// ...
}
// unlaunched という名前をつけたコンストラクタ。内部でデフォルトコンストラクタを呼び出している
Spacecraft.unlaunched(String name) : this(name, null);
// メソッド
void describe() {
print('Spacecraft: $name');
// Type promotion doesn't work on getters.
var launchDate = this.launchDate;
if (launchDate != null) {
int years = DateTime.now().difference(launchDate).inDays ~/ 365;
print('Launched: $launchYear ($years years ago)');
} else {
print('Unlaunched');
}
}
}
void main() {
var voyager = Spacecraft('Voyager I', DateTime(1977, 9, 5));
voyager.describe();
var voyager3 = Spacecraft.unlaunched('Voyager III');
voyager3.describe();
}
実行結果
Spacecraft: Voyager I
Launched: 1977 (47 years ago)
Spacecraft: Voyager III
Unlaunched
終わり
Dart の基本文法を見てきました。
JavaScript 等 他の言語と似ている部分が多く、とっつきやすいですね。
では、続きは次回にしたいと思います。