web-dev-qa-db-ja.com

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

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

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

92
Seth Ladd

Dartには、2つのタイプのオプションパラメータがあります:namedおよびpositional。相違点について説明する前に、まず類似点について説明します。

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

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

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

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

[ ]でラップされたパラメーターは、位置のオプションパラメーターです。以下に例を示します。

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

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

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

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]) {
  // ...
}

オプションのパラメーターは、positionalです。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}) {
  // ...
}

3番目のパラメーターの有無にかかわらず、getHttpUrlを呼び出すことができます。 must関数を呼び出すときにパラメーター名を使用します。

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!
}
175
Seth Ladd

関数のパラメーターが「paramName:value」構文を使用して指定されている場合、それは名前付きパラメーターです。このようなパラメーターは、[と]の括弧で囲むことによりオプションとしてレンダリングできます。この機能の初歩的なデモンストレーションは、次のHello Worldプログラムで実演できます。

sayHello([String name = ' World!']) {
  print('Hello, ${name}');
}

void main() {
  sayHello('Govind');
}
2
Balepur

私の理解したDartでは、メソッドパラメータは2つのタイプで指定できます。

  • 必須パラメーター
  • オプションのパラメーター(位置、名前、およびデフォルト)

>>必須パラメーター

必須パラメーターは、よく知られている古いスタイルのパラメーターであり、私たち全員がよく知っています

findVolume(int length, int breath, int height) {
 print('length = $length, breath = $breath, height = $height');
}

findVolume(10,20,30);

出力:

length = 10, breath = 20, height = 30

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

パラメーターは角括弧で開示されます[]&角括弧で囲まれたパラメーターはオプションです。

例:

findVolume(int length, int breath, [int height]) {
 print('length = $length, breath = $breath, height = $height');
}

findVolume(10,20,30);//valid
findVolume(10,20);//also valid

出力:

length = 10, breath = 20, height = 30
length = 10, breath = 20, height = null // no value passed so height is null

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

  • パラメータは中括弧{}で開示されます
  • 中括弧で囲まれたパラメーターはオプションです。
  • パラメータ名を使用して、colanで区切られた値を割り当てる必要があります:
  • 中括弧で囲まれたパラメーターの順序は問題ではありません
  • これらの型パラメーターは、多くのパラメーターを持つ関数に値を渡す際の混乱を避けるのに役立ちます。

例:

findVolume(int length, int breath, {int height}) {
 print('length = $length, breath = $breath, height = $height');
}

findVolume(10,20,height:30);//valid & we can see the parameter name is mentioned here.
findVolume(10,20);//also valid

出力:

length = 10, breath = 20, height = 30
length = 10, breath = 20, height = null

>>オプションのデフォルトパラメータ

  • オプションの名前付きパラメーターと同様に、このパラメーターにデフォルト値を割り当てることができます。
  • つまり、値は渡されず、このデフォルト値が使用されます。

例:

findVolume(int length, int breath, {int height=10}) {
 print('length = $length, breath = $breath, height = $height');
} 

findVolume(10,20,height:30);//valid
findVolume(10,20);//valid 

出力:

length = 10, breath = 20, height = 30
length = 10, breath = 20, height = 10 // default value 10 is taken

この動画リンクから提供された明確な説明、動画作成者の功績に感謝します。

ビデオリンク:OptionalPositionalParameters

ビデオリンク:OptionalNamedParameters

ビデオリンク:OptionalDefaultParameters

1
SaravanaRaja

doc から、positionalパラメーターとnamedパラメーターの両方がオプションであることがわかります。つまり、これらはすべて省略できます。

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

_String say({String from, String msg})
_

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

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

0
CoXier