Dart

Dartは、オブジェクト指向のプログラミング言語で、Googleによって開発されました。Dartは、Webアプリケーションやモバイルアプリケーションの開発に適しており、柔軟性と高速性が特徴です。
このチュートリアルでは、Dartプログラミング言語の基本的な構文と機能について学ぶことができます。初心者から中級者まで、プログラミングのスキルレベルに関わらず、誰でもこのチュートリアルから学習を開始することができます。
DartはGoogleによって開発されたオブジェクト指向のプログラミング言語です。Webアプリケーションやモバイルアプリケーションの開発に使用されています。
Dartは静的型付けの言語で、ライブラリやフレームワークが豊富に用意されています。FlutterというUIフレームワークもDartで書かれており、Flutterにより、多くの種類のプラットフォーム向けにアプリケーションを開発することができます。
DartPad というサイトを使うと、自分の環境にインストールしないでもブラウザ上で Dart のプログラミングが行なえます。
⇒ https://dart.dev/#try-dart
Get the Dart SDK を入手できます。
Windowsの場合は、公式インストール方法ではパッケージマネージャーの Chocolatey を使うのですが日本では馴染みがないようなので、これとは別にコミュニティによる用意されたインストーラを使うと良いでしょう。⇒ https://gekorm.com/dart-windows/
dartのバージョンは、
で確認できます。
のようにバージョン番号が出たら、成功です。
print関数などのよく使われる関数はdart:coreライブラリにありますが、dart:coreライブラリはimport不要で使えます。
実行方法は、コマンドプロンプトあるいはWindows Terminalで、
です。
Dartが初めてのプログラミング言語という人は少ないでしょうから、他の言語にはあまりないDart固有の機能をまとめて紹介します。
Dartではnull安全性が組み込まれており、変数がnullを許容するかどうかを明示的に指定します。例えば、int型の変数にnullを代入するためにはint?という型を使用します。この機能により、nullに関連するエラーやバグを減らすことができます。
以下は、Dart 2.12で追加されたNull安全性の機能を含んだコードの例です。Null安全性はDartの重要な変更点の一つであり、?や!などの新しい機能が導入されました。
この例では、String? nullableStringというnullableな文字列型変数を宣言し、if文でnullチェックして安全にプロパティにアクセスしています。また、??演算子を使用してnullableな変数がnullの場合の代替値を設定し、!演算子を使ってnullチェックをバイパスして非nullを保証しています。
Dartには他の言語にはあまり見られない、拡張メソッドという機能があります。これにより、既存のクラスに新しいメソッドを追加することができます。
Dartではリストやマップ、セットなどのコレクションを簡潔に初期化するための構文があります。
これにより、コレクションを宣言して初期化する手順を簡素化できます。
クラスのコンストラクタがフィールドの初期化しか行わない場合、{this.field}のような記述でコンストラクタを省略できます。
これにより、フィールドの初期化を簡潔に表現できます。
Dartには整数型や浮動小数型などの型があります。変数の宣言のときに型を明示する方法と、初期化する値から型を推論する方法があります。

Dartでは、型は var 宣言を使うことで型推論させることができます。
文字列の中に、式を埋め込むことができます。
文字列の中に ${ 式 } の形式で埋込むと、実行時に展開されます。
文字列の中に埋込む式が単一の変数ならばより簡略化した形式で表現できます。
文字列の中に $変数名 の形式で埋込むと、実行時に展開されます。
改行などに対するバックスラッシュ・エスケープ・シーケンスは他のプログラミング言語と同様に使えます。
「\」そのものを表示したい場合は、先頭にもうひとつ「\」をつけて「\\」のようにするだけです。
以下は、Dartにおける一般的な型とそれぞれのリテラル例を示した一覧表です。
これらはDartでよく使われる基本的な型の一覧です。それぞれの型は異なる種類のデータを表し、リテラル例はその型の値を表す例示です。
Dartには、コレクションの要素を特定の条件に基づいて動的に生成するためのgenerateメソッドがあります。これはリストやマップを生成する際に便利な方法です。
この例では、List.generateメソッドを使用して、要素数が5個で、各要素がインデックスに2を掛けた値で初期化されたリストを生成しています。
generateメソッドの構文は次のようになります。
同様に、generateメソッドはマップを生成するためにも使用できます。
この例では、0から4までのキーを持ち、それぞれの値が'Value 0'から'Value 4'まで連番になるマップを生成しています。
Dartのコレクション(リスト、マップ、セットなど)を操作するために便利なイテレーションメソッドがいくつか用意されています。以下はその一部です。
forEach: 各要素に対して特定の処理を行います。
map: 各要素を変換して新しいリストを作成します。
where: 条件に一致する要素のみをフィルタリングします。
reduce: 要素を結合して1つの値に縮約します。
forEach: 各エントリー(キーと値のペア)に対して特定の処理を行います。
map: キーと値を変換して新しいマップを作成します。
keys / values: キーのコレクション / 値のコレクションを取得します。
これらのイテレーションメソッドは、コレクションの要素を効果的に操作し、必要な処理を実行するために利用されます。
コメントをソースコードに書くときは、//や、/*と*/を使用します。
下記コードのように//を使うと行末までがコメントになります。
下記コードのように/*と*/で文を囲むと2行以上をコメントにできます。
関数は戻値の型と関数名と仮引数リストで定義します。 関数の呼出しは、関数名と実引数リストを与えます。
このコードでは、add関数とsub関数が定義されています。add関数はxとyの和を計算し、その結果を返します。一方、sub関数はxからyを引いた結果を返します。main関数では、これらの関数を引数を指定して呼び出し、結果を出力しています。
add関数は通常のブロック構文で定義されており、sub関数はアロー構文を使用して短く表記されています。このような表記法は、1行で簡潔に関数を定義する場合に便利です。
Dartには、様々な用途に特化した多くのライブラリーが存在します。以下は、Dartでよく使用されるライブラリーの一部です。
これらのライブラリー以外にも、様々な目的に特化したライブラリーが存在しています。Dartの公式ドキュメントや、Dart Pubと呼ばれるパッケージマネージャーで検索することで、必要なライブラリーを見つけることができます。
print関数などのよく使われる関数はdart:coreライブラリーにあり、dart:coreライブラリーはimportが不要ですが、それ以外のライブラリーはimportが必要です。
Dartの型システムの説明の前なので、簡単な例の説明に留めました。
Dartには、if-else文、for文、while文、do-while文、switch文、forEachメソッドなど、多様な制御構造があります。

forEachメソッドは、リストやマップなどのコレクションの各要素に対して指定した処理を実行するためのメソッドです。
また、forEachメソッドは、以下のようにラムダ式を使用して簡略化することもできます。
Dartはオブジェクト指向言語であり、クラスを使ってオブジェクトを定義できます。クラスはフィールドとメソッドを持ち、フィールドはオブジェクトの状態を表し、メソッドはオブジェクトの振る舞いを定義します。
以下は、Dartでクラスを定義し、オブジェクトを作成する例です。例として、Personクラスを定義し、名前と年齢をフィールドに持ち、年齢を1歳増やすメソッドを定義します。また、main関数で2つのPersonオブジェクトを作成し、1つのオブジェクトの年齢を増やして表示します。
継承は、既存のクラスを基にして新しいクラスを定義することができます。
コードの理解はプログラミング言語の学習において重要です。 以下は、動作する簡潔なコード例をいくつかご紹介します。
エラトステネスの篩を、若干 Dart らしく書いてみました。
エラトステネスの篩は、効率的な方法で素数を見つけるアルゴリズムであり、指定された範囲の素数を比較的高速に見つけることができます。
最大公約数と最小公倍数を、若干 Dart らしく書いてみました。
このDartコードは、与えられた整数の最大公約数(GCD)および最小公倍数(LCM)を計算します。gcd2関数はユークリッドの互除法を使用してGCDを計算し、lcm2関数は G C D ( m , n ) ⋅ L C M ( m , n ) = m ⋅ n {\displaystyle GCD(m,n)\cdot LCM(m,n)=m\cdot n} を利用してLCMを計算します。そして、gcdおよびlcm関数は、与えられた整数リストに対してそれぞれGCDおよびLCMを計算します。main関数では、それらの関数を使用していくつかの計算結果を出力しています。
二分法を、若干 Dart らしく書いてみました。
このDartコードは、二分法を使用して与えられた関数の根(ゼロとなる点)を見つけます。bisection関数は、指定された範囲内で与えられた関数fの根を見つけます。main関数では、いくつかの関数を用いて根を見つけるためにbisection関数を呼び出しています。