Dart에서 명명 된 매개 변수와 위치 매개 변수의 차이점은 무엇입니까?


146

Dart는 명명 된 선택적 매개 변수와 위치 선택적 매개 변수를 모두 지원합니다. 이 둘의 차이점은 무엇입니까?

또한 선택적 매개 변수가 실제로 지정되었는지 어떻게 알 수 있습니까?

답변:


272

Dart에는 namedpositional 의 두 가지 유형의 선택적 매개 변수가 있습니다. 차이점에 대해 논의하기 전에 먼저 유사점에 대해 논의하겠습니다.

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

선택적 매개 변수는 을 지정하려는 경우 생략 할 수없는 위치 에 있습니다 .portnumRetries

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

4
? 연산자가 더 이상 사용되지 않습니다. 다트 자습서에서 scale == null 조건 만 발견했습니다. (expr1? expr2 : expr3 여전히 작동)
Zdeněk Mlčoch

1
함수에 대한 여러 개의 명명 된 매개 변수를 사랑했지만 찾기가 어려웠습니다! 문서의 생성자 부분에서 더 잘 보일까요? ;)
willsquire

1
dartlang.org/guides/language/… 에 따라 기본값 =대신을 ( 를) 대신 지정해야합니다 . :
nbro

31

내가 이해 한 다트에서는 메소드 매개 변수를 두 가지 유형으로 지정할 수 있습니다.

  • 필수 매개 변수
  • 선택적 매개 변수 (위치, 이름 및 기본값)

>> 필수 매개 변수

필수 매개 변수는 우리가 잘 알고있는 오래된 스타일 매개 변수입니다.

:

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

에서 문서 우리 둘 것을 얻을 수 positionalnamed매개 변수들이 모두 존재하지 않을 수 있음을 의미, 선택 사항입니다.

제 생각에 named매개 변수는 매개 변수보다 더 엄격 positional합니다. 예를 들어, 그러한 메소드를 선언 한 경우 :

String say({String from, String msg})

from하고 msg있는 named당신이 메서드를 호출 할 때, 매개 변수를 say사용해야합니다 say(from: "xx", msg: "xx"). 열쇠는 없을 수 없습니다.

그러나 위치 매개 변수를 사용하면 무료입니다.


의사는 말합니다 :> 선택적 매개 변수는 이름이 있거나 위치가 될 수 있지만 둘다는 아닙니다. 위치 매개 변수가 선택적이라고하는 곳은 어디입니까?
Markon

위치 매개 변수는 "첫 번째 매개 변수 또는 두 번째 등"이기 때문에 프로그래밍 언어에서 기본 매개 변수 스타일입니다. Named매개 변수는 실제로 위치가 아닌 이름으로 식별 할 수 있기 때문에 호출됩니다 (이름이 지정된 두 매개 변수의 위치를 ​​전환하는 경우에는 중요하지 않음).
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.