dart:core コアライブラリ

dart:core はDartが暗黙的に自動インポートする標準コアライブラリで、言語に必要な基本機能を提供します。モジュールごとに主要機能とサンプルコードをまとめます。

つまり開発者がインポート文を記述しなくても、自動的に読み込まれる仕組みです。

一、コンソール出力

トップレベル関数 print() は、オブジェクトの toString() を自動的に呼び出して文字列を出力します。

void main() {
  var tea = "milk tea";
  print(tea);
  print('I drink $tea.');
}Code language: Dart (dart)

二、数値型:num / int / double

  1. 継承関係:intdouble はいずれも num を継承
  2. 文字列から数値へ変換:parse()。int は基数 radix に対応
  3. 数値から文字列へ変換:
  • 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を実装)

汎用高階メソッド:forEachmapwhereanyevery

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組み立てに使用

  1. encodeFull:空白などのみエスケープ、/ : ? & などURL記号を保持
  2. 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 コアライブラリ

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です