229

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

また、オプションのパラメーターが実際に指定されているかどうかをどのように確認できますか?

4

7 に答える 7

427

Dart には、 namedpositionalの 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]) {
  // ...
}

オプションのパラメーターは、指定する場合に省略できないという点で定位置です。portnumRetries

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!
}
于 2012-11-07T06:24:06.690 に答える
3

docから、positionalとパラメータの両方namedがオプションであることがわかります。つまり、それらはすべて存在しない可能性があります。

私の意見では、namedパラメーターはパラメーターよりも厳密ですpositional。たとえば、そのようなメソッドを宣言すると:

String say({String from, String msg})

上記fromの とmsgnamedパラメーターです。メソッドを呼び出すときは、 をsay使用する必要がありますsay(from: "xx", msg: "xx")。キーは欠席できません。

ただし、位置パラメーターを使用する場合は自由です。

于 2019-01-07T13:15:18.860 に答える