🦁

【Dart】main(List<String> arguments){}を動かしてみる

2022/05/07に公開

概要

サンプルコードでmain()に以下のように引数が入っているもの
main(List<String> arguments)
があり、main()で引数を渡して実行する方法がわからなかったので調べたことを記事にしました。

分かりづらい点や、誤り等ございましたら、ご指摘いただけるとありがたいです。
(Twitterにご連絡ください。)
この記事がどなたかの参考になれば幸いです。

https://dart.dev/guides/language/language-tour#the-main-function
ここに記載されている以下のコードを動かしてみます。

Here’s an example of the main() function for a command-line app that takes arguments:
引数を取るコマンドラインアプリのmain()関数の例です。

// Run the app like this: dart args.dart 1 test
void main(List<String> arguments) {
  print(arguments);

  assert(arguments.length == 2);
  assert(int.parse(arguments[0]) == 1);
  assert(arguments[1] == 'test');
}

実行環境

macOS 12.3.1
Dart SDK version: 2.16.0 (stable)
zsh 5.8

解説のようなもの

どうもcommand-line appとしてmain(List<String> arguments)を実行すれば、mainの引数に
値を渡して実行できるようです。
※command-line appとassertについてはこの後にまとめてあります。
実行の仕方はコメントで記載されているように、main()が書いてあるファイルと、List<String>に入れる要素をスペース空けて並べてterminalで記述すれば、実行できます。
コメントに書いてあるコマンドの仕組みは以下のようになります。

dart [実行ファイルのpath] [List<String>に入れる要素1] [List<String>に入れる要素2]... 

このコマンドをterminalで実行すれば、
各要素がList<String>に順番に入れられて、main()の引数になり実行されます。

ただし、サンプルコードにはassert文が書いてありますが、コメントの通りterminalでdartで実行しても、assertは実行されません。
assertを動かすには

dart run --enable-asserts args.dart 1 test

のように
dart runでオプション --enable-asserts をつけて実行する必要があります。

command-line appとは

terminalとかのコマンドラインから直接ファイルを実行し、コマンドライン上で動作するアプリのようです。
ちょっと用語が違いますが、

コンソールアプリケーションとは、逐次的な文字メッセージの出力により現在の状態や処理結果を伝達するアプリケーションソフトのこと。OSなどのコマンドラインインターフェース(CLI)で実行される。
コンソールアプリケーション(コンソールプログラム)とは - IT用語辞典 e-Words

Dartの他の言語でもあり、呼び方はCliツールとかコンソールアプリとか様々なようです。
Dartではcommand-line appと呼んでいるようです。

assertについて

()内の条件を満たしているかassertでチェックします。()内の条件を満たしていないとUnhandled Exceptionを出して、実行はそこでストップします。

構文

assert(condition, optionalMessage);
  • condition(条件)を満たしていないと次の行へ進まない。
    満たされないとUnhandled Exceptionを吐き出す。
  • optionalMessageはUnhandled Exceptionの時に表示されるメッセージになる。
  • assertはFlutterのdebugモードのみ有効。runだと無視される。
  • dart runみたいなコマンドでプログラム実行するときは、コマンドラインフラグ --enable-asserts つける必要がある。
// sample
dart run --enable-asserts lib/test.dart

動かしてみる

実際に冒頭のサンプルコードを動かしてみます。
assertされてるかわかるように、各assert文の後にprintを入れます

args.dart
void main(List<String> arguments) {
  print(arguments);

  assert(arguments.length == 2, 'list length is not 2!');
  print('first assertion');
  assert(int.parse(arguments[0]) == 1);
  print('second assertion');
  assert(arguments[1] == 'test');
  print('third assertion');
}	

terminalで全てのassertを通過するように以下のように実行してみます。

terminal
% dart run --enable-asserts lib/samples/args.dart 1 test

実行結果

terminal
[1, test]
first assertion
second assertion
third assertion

全てassertが実行されているのがわかります。
次はassertに引っかかるように書いて実行してみます。

terminal
% dart run --enable-asserts lib/samples/args.dart 1 test test2

実行結果

terminal
[1, test, test2]
Unhandled exception:
'package:youtube_data_sample/samples/args.dart': Failed assertion: line 8 pos 10: 'arguments.length == 2': list length is not 2!

このような感じでUnhandled exceptionが表示され、
assert文で記述していたoptinalMessageも表示されているのがわかります。

最後に

ここまで読んでいただきありがとうございました!

参考サイト

main()について
https://dart.dev/guides/language/language-tour#the-main-function

command-line appについて
https://dart.dev/tutorials/server/cmdline

assertについて
https://dart.dev/guides/language/language-tour#assert

Discussion