回答:
Dartには2つのタイプのオプションパラメータがあります。namedとPositionalです。違いを説明する前に、まず類似点について説明しましょう。
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!
}
私の理解しているダートでは、メソッドパラメータは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
>>オプションの名前付きパラメーター
例:
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
docから、positional
とnamed
パラメータの両方がオプションであることがわかります。つまり、これらはすべて省略できるということです。
私の意見では、named
パラメーターはパラメーターよりも厳密ですpositional
。たとえば、そのようなメソッドを宣言すると、次のようになります。
String say({String from, String msg})
上記from
とmsg
ありnamed
ますが、メソッド呼び出しのパラメーター、say
あなたが使用する必要がありますがsay(from: "xx", msg: "xx")
。キーをなくすことはできません。
ただし、位置パラメータを使用する場合は自由です。
Named
パラメータは、位置ではなく名前で実際に識別できるため、このように呼ばれます(2つの名前付きパラメータの位置を入れ替えても問題ありません)。上記のSavaranarajaからの回答をご覧ください
位置パラメータ:
これらはデフォルトのパラメーターと同じです。例えば:
void add(int x, [int y = 3]);
ここで、yのデフォルト値は3です。
名前付きパラメーター:
これらは、パラメーターの名前とその後に渡される値を渡すことにより、任意の順序で渡すことができるパラメーターです。例えば:
void sum({int num1, int num2});
この関数は次のように呼び出されます:
sum(num1: 12, num2: 24);
また、名前付きパラメーターは、デフォルト値を持つこともできます。