Dart は、名前付きオプション パラメータと位置オプション パラメータの両方をサポートしています。2つの違いは何ですか?
また、オプションのパラメーターが実際に指定されているかどうかをどのように確認できますか?
Dart は、名前付きオプション パラメータと位置オプション パラメータの両方をサポートしています。2つの違いは何ですか?
また、オプションのパラメーターが実際に指定されているかどうかをどのように確認できますか?
Dart には、 namedとpositionalの 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!
}
docから、positional
とパラメータの両方named
がオプションであることがわかります。つまり、それらはすべて存在しない可能性があります。
私の意見では、named
パラメーターはパラメーターよりも厳密ですpositional
。たとえば、そのようなメソッドを宣言すると:
String say({String from, String msg})
上記from
の とmsg
はnamed
パラメーターです。メソッドを呼び出すときは、 をsay
使用する必要がありますsay(from: "xx", msg: "xx")
。キーは欠席できません。
ただし、位置パラメーターを使用する場合は自由です。