Dart の名前付きパラメータと位置パラメータの違いは何ですか? 質問する

Dart の名前付きパラメータと位置パラメータの違いは何ですか? 質問する

Dart は、名前付きオプション パラメータと位置オプション パラメータの両方をサポートしています。この 2 つの違いは何ですか?

また、オプションのパラメータが実際に指定されたかどうかはどうすればわかりますか?

ベストアンサー1

Dart には、名前付き位置指定の 2 種類のオプション パラメータがあります。違いについて説明する前に、まず類似点について説明しましょう。

Dart のオプション パラメータはオプションであり、関数を呼び出すときに呼び出し側がパラメータの値を指定する必要はありません。

オプション パラメータは、必須パラメータの後にのみ宣言できます。

オプションのパラメータにはデフォルト値を設定できます。デフォルト値は、呼び出し元が値を指定しない場合に使用されます。

位置オプションパラメータ

で囲まれたパラメータは[ ]、位置指定のオプション パラメータです。次に例を示します。

getHttpUrl(String server, String path, [int port=80]) {
  // ...
}

上記のコードでは、portはオプションであり、デフォルト値は です80

getHttpUrl3 番目のパラメータの有無にかかわらず呼び出すことができます。

getHttpUrl('example.com', '/index.html', 8080); // port == 8080
getHttpUrl('example.com', '/index.html');       // port == 80

関数には複数の位置パラメータを指定できます。

getHttpUrl(String server, String path, [int port=80, int numRetries=3]) {
  // ...
}

オプション パラメータは位置指定されportており、指定する場合は省略できませんnumRetries

getHttpUrl('example.com', '/index.html');
getHttpUrl('example.com', '/index.html', 8080);
getHttpUrl('example.com', '/index.html', 8080, 5);

もちろん、8080 と 5 が何であるかを知らないと、それらの魔法の数字が何であるかを判断するのは困難です。名前付きのオプション パラメータを使用すると、より読みやすい API を作成できます。

名前付きオプションパラメータ

で囲まれたパラメータは、{ }名前付きオプション パラメータです。次に例を示します。

getHttpUrl(String server, String path, {int port = 80}) {
  // ...
}

getHttpUrl3 番目のパラメータの有無にかかわらず呼び出すことができます。関数を呼び出すときは、パラメータ名を使用する必要があります。

getHttpUrl('example.com', '/index.html', port: 8080); // port == 8080
getHttpUrl('example.com', '/index.html');             // port == 80

関数には複数の名前付きパラメータを指定できます。

getHttpUrl(String server, String path, {int port = 80, int numRetries = 3}) {
  // ...
}

名前付きパラメータは名前で参照されるため、宣言とは異なる順序で使用できます。

getHttpUrl('example.com', '/index.html');
getHttpUrl('example.com', '/index.html', port: 8080);
getHttpUrl('example.com', '/index.html', port: 8080, numRetries: 5);
getHttpUrl('example.com', '/index.html', numRetries: 5, port: 8080);
getHttpUrl('example.com', '/index.html', numRetries: 5);

名前付きパラメータを使用すると、特にブールフラグやコンテキスト外の数値がある場合に、呼び出しサイトがわかりやすくなると思います。

オプションパラメータが指定されているかどうかを確認しています

残念ながら、「オプション パラメータが指定されなかった場合」と「オプション パラメータがデフォルト値で指定された場合」を区別することはできません。

注意:位置オプション パラメータまたは名前付きオプション パラメータを使用できますが、同じ関数またはメソッド内で両方を使用することはできません。次の例は許可されていません。

thisFunctionWontWork(String foo, [String positonal], {String named}) {
  // will not work!
}

おすすめ記事