1. ホーム
  2. ヒラメキ

[解決済み】Dartの名前付きパラメータと位置付きパラメータの違いは何ですか?

2022-04-08 15:35:58

質問

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

また、オプショナル・パラメーターが実際に指定されたかどうかは、どのように見分けるのですか?

どのように解決するのですか?

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!
}