dart:core はDartが暗黙的に自動インポートする標準コアライブラリで、言語に必要な基本機能を提供します。モジュールごとに主要機能とサンプルコードをまとめます。
つまり開発者がインポート文を記述しなくても、自動的に読み込まれる仕組みです。
一、コンソール出力
トップレベル関数 print() は、オブジェクトの toString() を自動的に呼び出して文字列を出力します。
void main() {
var tea = "milk tea";
print(tea);
print('I drink $tea.');
}Code language: Dart (dart)
二、数値型:num / int / double
- 継承関係:
int、doubleはいずれもnumを継承 - 文字列から数値へ変換:
parse()。int は基数 radix に対応 - 数値から文字列へ変換:
toString():基本的な変換toStringAsFixed(n):小数点以下n桁を保持toStringAsPrecision(n):有効数字n桁
void main() {
// 文字列から数値へ変換
assert(int.parse('42') == 42);
assert(int.parse('42', radix:16) == 66);
assert(double.parse('0.5') == 0.5);
// 数値から文字列へ変換
assert(123.456.toStringAsFixed(2) == '123.46');
assert(123.456.toStringAsPrecision(2) == '1.2e+2');
}Code language: Dart (dart)
三、文字列 String & 正規表現 RegExp
- String はイミュータブル(不変)(すべての変更メソッドは新しい文字列を返す)。内部はUTF-16コードユニットで保持
- よく使う処理:検索、部分取得、分割、大文字小文字変換、空白除去
void main() {
var str = 'Never odd or even';
// 検索
assert(str.contains('odd'));
assert(str.startsWith('Never'));
assert(str.endsWith('even'));
assert(str.indexOf('odd') == 6);
// 部分取得・分割
assert(str.substring(6,9) == 'odd');
var parts = 'a b c'.split(' ');
// トリム・空判定
assert(' abc '.trim() == 'abc');
assert(''.isEmpty);
assert(' '.isNotEmpty);
// 大文字小文字
assert('dart'.toUpperCase() == 'DART');
// 文字列連結にはStringBufferを優先(パフォーマンス向上)
var sb = StringBuffer();
sb.write('Hello ');
sb.writeAll([ 'A','B','C' ], ',');
print(sb.toString());
}
正規表現 RegExp
void main() {
var reg = RegExp(r'\d+'); // 連続する数字に一致
var text = 'llamas live 15 to 20 years';
assert(reg.hasMatch(text));
// 全体一致を走査
for(var m in reg.allMatches(text)){
print(m.group(0));
}
// 置換
var res = text.replaceAll(reg, 'XX');
print(res);
}
注意:コードユニットだけでは人間が認識する文字と一致しません。絵文字の組み合わせなど複雑なUnicode文字にはサードパーティ製の
charactersパッケージを推奨します。
四、コレクション(List / Set / Map)
1. List:順序を保持、重複許可、添字によるアクセス可能
void main() {
var fruits = [ 'apple','orange' ];
fruits.add('kiwi');
fruits.addAll([ 'grape' ]);
fruits.removeAt(0);
fruits.sort((a,b)=>a.compareTo(b)); //ソート
// ジェネリクス制約
var strList = <String>[];
}
2. Set:順序不定、要素は一意、添字アクセス不可
void main() {
var set = <String>{};
set.addAll([ 'gold','xenon' ]);
set.add('gold'); //重複追加は無効
assert(set.contains('xenon'));
// 積集合演算
var set2 = Set.from([ 'xenon','argon' ]);
var inter = set.intersection(set2);
}
3. Map:キーと値のコレクション、キーは重複不可
void main() {
var map = {54: 'xenon'};
print(map[54]);
assert(map.containsKey(54));
map.remove(54);
// キーが存在しない場合のみ代入
map.putIfAbsent('name', () => 'Dart');
// 走査
map.forEach((k,v)=>print('$k:$v'));
}
4. Iterable 汎用コレクション操作(List/SetはIterableを実装)
汎用高階メソッド:forEach、map、where、any、every
void main() {
var list = [ 'green','black','chamomile' ];
list.forEach(print);
// mapは遅延評価、toListで即時実行
var upperList = list.map((e)=>e.toUpperCase()).toList();
// フィルタリング
var filter = list.where((e)=>e == 'chamomile');
assert(list.any((e)=>e == 'chamomile'));
assert(!list.every((e)=>e.contains('tea')));
}
五、URI処理(Uri)
URLのエンコード・デコード、解析、URL組み立てに使用
encodeFull:空白などのみエスケープ、/ : ? &などURL記号を保持encodeComponent:すべての特殊文字をエスケープ(パラメータ値のエンコードに適切)
void main() {
// URL解析
var uri = Uri.parse('https://example.org:8080/foo?lang=dart#frag');
print(uri.scheme);
print(uri.host);
print(uri.queryParameters);
// URL作成
var newUri = Uri.https('example.org','/foo', {'lang':'dart'});
}
六、日時 DateTime & Duration
DateTime:時点を表す、ローカルタイムゾーン / UTC に対応Duration:時間間隔、時間の加減算や差分計算に利用
void main() {
var now = DateTime.now();
var y2k = DateTime.utc(2000);
// 時間加減算
var nextYear = y2k.add(const Duration(days:366));
var diff = nextYear.difference(y2k);
print(diff.inDays);
// タイムスタンプ(ミリ秒、Unixエポック1970-01-01 UTC)
print(y2k.millisecondsSinceEpoch);
}
注意:サマータイムの影響で日数による加減算は誤差が発生しやすいため、UTC時刻を優先してください。
七、ユーティリティインターフェースと基底クラス
1. Comparable:オブジェクト同士の比較を実装、ソート処理に使用
class Line implements Comparable<Line> {
final int length;
const Line(this.length);
@override
int compareTo(Line other) => length - other.length;
}
2. カスタムMapキー:== と hashCode をオーバーライド
ルール:等価なオブジェクトは同じhashCodeを持つ必要がある
class Person {
final String first, last;
Person(this.first,this.last);
@override
int get hashCode => Object.hash(first, last);
@override
bool operator ==(Object other) =>
other is Person && other.first == first && other.last == other.last;
}
- 3. Iterable + Iterator
Iterable を実装すると for-in ループに対応し、独自の反復ロジックを定義できます。
八、例外処理
- Error:重大な障害。原則として捕捉しない(例:NoSuchMethodError)
- Exception:事前に想定可能な例外。捕捉可能。独自例外を作成可能
class FooException implements Exception {
final String? msg;
const FooException([this.msg]);
@override
String toString() => msg ?? 'FooException';
}
九、弱参照とファイナライザ
WeakReference:弱参照。GCによるオブジェクト回収を妨げないFinalizer / NativeFinalizer:オブジェクト回収後にコールバックを実行、ネイティブリソースを解放Finalizable:オブジェクトが早くGC回収されるのを防ぐ
dart:core コアライブラリ
Previous: dart:convert ライブラリ
Next: dart:io