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


145

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

また、オプションのパラメーターが実際に指定されたかどうかはどのようにしてわかりますか?

回答:


272

Dartには2つのタイプのオプションパラメータがあります。namedPositionalです。違いを説明する前に、まず類似点について説明しましょう。

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

オプションのパラメーターは定位置であり、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}) {
  // ...
}

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

4
?演算子は廃止されました。私はdartチュートリアルでscale == null状態のみを見つけました。(expr1とexpr2の?:expr3はまだ動作します)
ズデニェクMlčoch

1
関数の複数の名前付きパラメーターを愛して、これを見つけるのは困難でした!ドキュメントのコンストラクタの部分でさらによく見えるでしょうか?;)
willsquire、2014

1
dartlang.org/guides/language/…によると、デフォルト値はでは=なくで指定する必要があります。:
nbro 2017

31

私の理解しているダートでは、メソッドパラメータは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


3

「paramName:value」構文を使用して関数のパラメーターを指定すると、そのパラメーターは名前付きパラメーターになります。このようなパラメーターは、[と]の括弧で囲むことでオプションにできます。この機能の基本的なデモは、次のHello Worldプログラムでデモできます。

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

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

2

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

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

String say({String from, String msg})

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

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


このドキュメントでは、次のように述べています。位置パラメータはオプションであるとどこに記載されていますか?
Markon、

定位置パラメーターは、プログラミング言語のパラメーターのデフォルトスタイルであり、「最初のパラメーター、または2番目など」であるため、定位置と呼ばれます。 Namedパラメータは、位置ではなく名前で実際に識別できるため、このように呼ばれます(2つの名前付きパラメータの位置を入れ替えても問題ありません)。上記のSavaranarajaからの回答をご覧ください
Markon

0

位置パラメータ:

これらはデフォルトのパラメーターと同じです。例えば:

void add(int x, [int y = 3]);

ここで、yのデフォルト値は3です。

名前付きパラメーター:

これらは、パラメーターの名前とその後に渡される値を渡すことにより、任意の順序で渡すことができるパラメーターです。例えば:

void sum({int num1, int num2});

この関数は次のように呼び出されます:

sum(num1: 12, num2: 24);

また、名前付きパラメーターは、デフォルト値を持つこともできます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.