답변:
Dart에는 named 및 positional 의 두 가지 유형의 선택적 매개 변수가 있습니다. 차이점에 대해 논의하기 전에 먼저 유사점에 대해 논의하겠습니다.
Dart의 선택적 매개 변수는 호출자가 함수를 호출 할 때 매개 변수의 값을 지정할 필요가 없다는 점에서 선택적 입니다.
선택적 매개 변수는 필수 매개 변수 이후에만 선언 할 수 있습니다.
선택적 매개 변수의 기본값은 호출자가 값을 지정하지 않을 때 사용됩니다.
위치 선택적 매개 변수
래핑 된 매개 변수 [ ]
는 위치 선택적 매개 변수입니다. 예를 들면 다음과 같습니다.
getHttpUrl(String server, String path, [int port=80]) {
// ...
}
위의 코드에서 port
선택적이며 기본값은 80
입니다.
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]) {
// ...
}
선택적 매개 변수는 을 지정하려는 경우 생략 할 수없는 위치 에 있습니다 .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
세 번째 매개 변수를 사용하거나 사용하지 않고 호출 할 수 있습니다 . 당신은 해야한다 함수를 호출 할 때 매개 변수 이름을 사용합니다.
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!
}
내가 이해 한 다트에서는 메소드 매개 변수를 두 가지 유형으로 지정할 수 있습니다.
>> 필수 매개 변수
필수 매개 변수는 우리가 잘 알고있는 오래된 스타일 매개 변수입니다.
예 :
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
에서 문서 우리 둘 것을 얻을 수 positional
와 named
매개 변수들이 모두 존재하지 않을 수 있음을 의미, 선택 사항입니다.
제 생각에 named
매개 변수는 매개 변수보다 더 엄격 positional
합니다. 예를 들어, 그러한 메소드를 선언 한 경우 :
String say({String from, String msg})
위 from
하고 msg
있는 named
당신이 메서드를 호출 할 때, 매개 변수를 say
사용해야합니다 say(from: "xx", msg: "xx")
. 열쇠는 없을 수 없습니다.
그러나 위치 매개 변수를 사용하면 무료입니다.
Named
매개 변수는 실제로 위치가 아닌 이름으로 식별 할 수 있기 때문에 호출됩니다 (이름이 지정된 두 매개 변수의 위치를 전환하는 경우에는 중요하지 않음).