Dartは、名前付きオプションパラメータと位置オプションパラメータの両方をサポートしています。 2つの違いは何ですか?
また、オプションのパラメーターが実際に指定されたかどうかをどのように確認できますか?
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!
}
関数のパラメーターが「paramName:value」構文を使用して指定されている場合、それは名前付きパラメーターです。このようなパラメーターは、[と]の括弧で囲むことによりオプションとしてレンダリングできます。この機能の初歩的なデモンストレーションは、次のHello Worldプログラムで実演できます。
sayHello([String name = ' World!']) {
print('Hello, ${name}');
}
void main() {
sayHello('Govind');
}
私の理解した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
>>オプションの名前付きパラメータ
例:
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")
を使用する必要があります。キーをなくすことはできません。
ただし、定位置パラメーターを使用する場合は自由です。