Dart を Homebrew で macOS にインストールする
Homebrew を使って Dart をインストールする。
インストール方法は Dart 公式ドキュメントの Get the Dart SDK | Dart を参考にした。
$ brew tap dart-lang/dart
$ brew install dart
$ which dart
/usr/local/bin/dart
$ dart --version
Dart VM version: 2.7.0 (Fri Dec 6 16:26:51 2019 +0100) on "macos_x64"
Hello World
以下の内容の hello.dart というファイルを用意する。
void main() {
print('Hello, World!');
}
dart コマンドで実行する。
$ dart hello.dart
Hello, World!
参考:
ネイティブの実行ファイルを生成する
dart2native コマンドでスタンドアローンの実行ファイルを生成することができる。
$ dart2native hello.dart -o hello
Generated: /Users/alice/hello
生成された実行ファイルは単体で実行することが可能。
$ ./hello
Hello, World!
ドキュメントによると、書いたプログラム自体のネイティブコードだけでなく、型チェックとガベージコレクションの処理をする Dart ランタイムが含まれているとのこと。
A standalone executable is native machine code that’s compiled from the specified Dart file and its dependencies, plus a small Dart runtime that handles type checking and garbage collection.
各種処理
ソースコードは Dart programming language | Dart トップページで提示されているものを使用した。
関数を使う
以下の内容の functions.dart というファイルを用意する。
// A function declaration.
int timesTwo(int x) {
return x * 2;
}
// Arrow syntax is shorthand for `{ return expr; }`.
int timesFour(int x) => timesTwo(timesTwo(x));
// Functions are objects.
int runTwice(int x, Function f) {
for (var i = 0; i < 2; i++) {
x = f(x);
}
return x;
}
main() {
print("4 times two is ${timesTwo(4)}");
print("4 times four is ${timesFour(4)}");
print("2 x 2 x 2 is ${runTwice(2, timesTwo)}");
}
実行結果。
$ dart functions.dart
4 times two is 8
4 times four is 16
2 x 2 x 2 is 8
if else 文とループ処理
bool isEven(int x) {
// An if-else statement.
if (x % 2 == 0) {
return true;
} else {
return false;
}
}
List<int> getEvenNumbers(Iterable<int> numbers) {
var evenNumbers = <int>[];
// A for-in loop.
for (var i in numbers) {
// A single-line if statement.
if (isEven(i)) evenNumbers.add(i);
}
return evenNumbers;
}
main() {
var numbers = List.generate(10, (i) => i);
print(getEvenNumbers(numbers));
}
実行結果。
$ dart if-and-loop.dart
[0, 2, 4, 6, 8]
配列、連想配列、集合
// A list literal.
var lostNumbers = [4, 8, 15, 16, 23, 42];
// A map literal.
var nobleGases = {
'He': 'Helium',
'Ne': 'Neon',
'Ar': 'Argon',
};
// A set literal.
var frogs = {
'Tree',
'Poison dart',
'Glass',
};
main() {
print(lostNumbers.last);
print(nobleGases['Ne']);
print(frogs.difference({'Poison dart'}));
}
実行結果。
$ dart collection.dart
42
Neon
{Tree, Glass}
参考:
- List class - dart:core library - Dart API
- Map class - dart:core library - Dart API
- Set class - dart:core library - Dart API
クラス
// Abstract classes can't be instantiated.
abstract class Item {
use();
}
// Classes can implement other classes.
class Chest<T> implements Item {
List<T> contents;
// Constructors can assign arguments to instance variables using `this`.
Chest(this.contents);
use() => print("$this has ${contents.length} items.");
}
class Sword implements Item {
int damage = 5;
use() => print("$this dealt $damage damage.");
}
// Classes can extend other classes.
class DiamondSword extends Sword {
int damage = 50;
}
main() {
// The 'new' keyword is optional.
var chest = Chest<Item>([
DiamondSword(),
Sword(),
]);
chest.use();
for (var item in chest.contents) {
item.use();
}
}
実行結果。
$ dart classes.dart
Instance of 'Chest<Item>' has 2 items.
Instance of 'DiamondSword' dealt 50 damage.
Instance of 'Sword' dealt 5 damage.