Dart は、名前付きオプション パラメータと位置オプション パラメータの両方をサポートしています。この 2 つの違いは何ですか?
また、オプションのパラメータが実際に指定されたかどうかはどうすればわかりますか?
ベストアンサー1
Dart には、名前付きと位置指定の 2 種類のオプション パラメータがあります。違いについて説明する前に、まず類似点について説明しましょう。
Dart のオプション パラメータはオプションであり、関数を呼び出すときに呼び出し側がパラメータの値を指定する必要はありません。
オプション パラメータは、必須パラメータの後にのみ宣言できます。
オプションのパラメータにはデフォルト値を設定できます。デフォルト値は、呼び出し元が値を指定しない場合に使用されます。
位置オプションパラメータ
で囲まれたパラメータは[ ]
、位置指定のオプション パラメータです。次に例を示します。
getHttpUrl(String server, String path, [int port=80]) {
// ...
}
上記のコードでは、port
はオプションであり、デフォルト値は です80
。
getHttpUrl
3 番目のパラメータの有無にかかわらず呼び出すことができます。
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}) {
// ...
}
getHttpUrl
3 番目のパラメータの有無にかかわらず呼び出すことができます。関数を呼び出すときは、パラメータ名を使用する必要があります。
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!
}