2019/12/19 Dart 関数(Functions)パート2

関数には二つのタイプの引数、「必須の引数」と「オプショナル引数」があります。引数が複数ある時「必須の引数」が最初に配置され、その後ろに「オプショナル引数」を配置します。オプショナル引数は「namedオプショナル引数」と「positionalオプショナル引数」に分けられます。

オプショナル引数

オプショナル引数は「namedオプショナル引数」か「positionalオプショナル引数」のどちらかです。

Named parameters

sample1-1

  //関数定義時のNamed parameterの使い方
  void enableFlags({bool bold, bool hidden}){
    print("${bold},${hidden}");
  }
  
  //関数実行時のNamed parameterの使い方
  enableFlags(bold : true,hidden : false);
  //true,false

上記の通りです。

関数定義時に引数がNamed parametersであることを示すために、上記のように引数を{ }で囲みます。

関数実行時の引数を、

(bold : 引数boldに渡す値,hidden : 引数hiddenに渡す値)

のように記述します。

sample1-1では関数定義時、第一引数がbold、第二引数がhiddenですが、

実行時、第一引数にhiddenを、第二引数にboldを指定することもできます。(sample1-2)

sample1-2

  //関数定義時のNamed parameterの使い方
  void enableFlags({bool bold, bool hidden}){
    print("${bold},${hidden}");
  }
  
  //関数実行時のNamed parameterの使い方
  enableFlags(bold : true,hidden : false);
  //true,false
  
  enableFlags(hidden : true,bold : false);
  //false,true

  enableFlags(hidden : true);  //optional parameterなので省略もできる。
  //null,true

引数の順番がどうであろうと、実行時に実引数boldに渡した値が関数定義の仮引数boldに、実引数hiddenに渡した値が関数定義の仮引数hiddenに渡されます。

本来Named parametersはオプショナルパラメーター(実行時に引数に値を指定しなくても良い)ですが、引数指定の前に@requiredと記述することで必須パラメーター(省略不可)にすることができます。

@required注釈を使用する場合、

import 'package:meta/meta.dart';

でmeta.dartをimportする必要があります。


Positional parameters

Named parametersであることを示すために関数定義時に引数を{ }で囲みましたが、positional parametersであることを示す時は、関数定義時に引数を[ ]で囲んで表現します。(sampel1-3)

sample1-3

String say(String from, String msg, [String device]) {
  var result = '$from says $msg';
  if (device != null) {
    result = '$result with a $device';
  }
  return result;
}

上記サンプルでは第三引数deviceがpositional parameterとして定義されています。positional parameterもオプショナルパラメータですので省略することができます。


引数のデフォルト値(初期値)

sample1-4

  void enableFlags({  bool bold=true, bool hidden=true}){
    print("${bold},${hidden}");
  }
  
  enableFlags();  //true,true
  
  enableFlags(bold : true,hidden : false);
  //true,false

上記sample1-4のように関数定義時に=を用いて上記のように記述すると引数のデフォルト値(初期値)を指定できます。デフォルト値はNamed parametersとpositional parameterの両方に指定できます。デフォルト値を設定しない場合自動的にデフォルト値はnullになります。


main()関数

全てのアプリはトップレベルにアプリのエントリーポイントとしてmain()関数を記述する必要があります。main関数はvoidを返し、オプショナルList<String>型の引数を取ります。


第一級オブジェクトとしての関数

別の関数の引数に関数を渡すことができます。以下に例を示します。

sample2-1

void printElement(int element) {
  print(element);
}

var list = [1, 2, 3];

// Pass printElement as a parameter.
list.forEach(printElement);
//1
//2
//3

forEachメソッドはlistの全ての要素に対して一回ずつ、引数として受け取った関数(printElement)を実行します。

以下のように関数を変数に代入することもできます。

sample2-2

var loudify = (msg) => '!!! ${msg.toUpperCase()} !!!';
print(loudify('hello'));
//!!! HELLO !!!

sample2-2では変数loudifyに、引数として受け取った文字列を大文字に変換する無名関数を代入しています。

 

 

参考

https://dart.dev/guides/language/language-tour#built-in-types

カテゴリーDart

コメントを残す

メールアドレスが公開されることはありません。