¿Cuál es la diferencia entre los parámetros con nombre y posicionales en Dart?

145

Dart admite parámetros opcionales con nombre y parámetros opcionales posicionales. ¿Cuáles son las diferencias entre los dos?

Además, ¿cómo puede saber si realmente se especificó un parámetro opcional?

Seth Ladd
fuente

Respuestas:

272

Dart tiene dos tipos de parámetros opcionales: nombrados y posicionales . Antes de discutir las diferencias, permítanme discutir primero las similitudes.

Los parámetros opcionales de Dart son opcionales porque la persona que llama no necesita especificar un valor para el parámetro cuando llama a la función.

Los parámetros opcionales solo se pueden declarar después de cualquier parámetro requerido.

Los parámetros opcionales pueden tener un valor predeterminado, que se utiliza cuando una persona que llama no especifica un valor.

Parámetros opcionales posicionales

Un parámetro envuelto por [ ]es un parámetro opcional posicional. Aquí hay un ejemplo:

getHttpUrl(String server, String path, [int port=80]) {
  // ...
}

En el código anterior, portes opcional y tiene un valor predeterminado de 80.

Puede llamar getHttpUrlcon o sin el tercer parámetro.

getHttpUrl('example.com', '/index.html', 8080); // port == 8080
getHttpUrl('example.com', '/index.html');       // port == 80

Puede especificar múltiples parámetros posicionales para una función:

getHttpUrl(String server, String path, [int port=80, int numRetries=3]) {
  // ...
}

Los parámetros opcionales son posicionales en el sentido de que no puede omitir portsi desea especificar numRetries.

getHttpUrl('example.com', '/index.html');
getHttpUrl('example.com', '/index.html', 8080);
getHttpUrl('example.com', '/index.html', 8080, 5);

Por supuesto, a menos que sepa qué son 8080 y 5, es difícil saber cuáles son esos números aparentemente mágicos. Puede usar parámetros opcionales con nombre para crear API más legibles.

Parámetros opcionales nombrados

Un parámetro envuelto por { }es un parámetro opcional con nombre. Aquí hay un ejemplo:

getHttpUrl(String server, String path, {int port = 80}) {
  // ...
}

Puede llamar getHttpUrlcon o sin el tercer parámetro. Usted debe utilizar el nombre del parámetro cuando se llama a la función.

getHttpUrl('example.com', '/index.html', port: 8080); // port == 8080
getHttpUrl('example.com', '/index.html');             // port == 80

Puede especificar varios parámetros con nombre para una función:

getHttpUrl(String server, String path, {int port = 80, int numRetries = 3}) {
  // ...
}

Debido a que los parámetros nombrados están referenciados por nombre, pueden usarse en un orden diferente al de su declaración.

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);

Creo que los parámetros con nombre hacen que los sitios de llamadas sean más fáciles de entender, especialmente cuando hay indicadores booleanos o números fuera de contexto.

Comprobando si se proporcionó un parámetro opcional

Desafortunadamente, no puede distinguir entre los casos "no se proporcionó un parámetro opcional" y "se proporcionó un parámetro opcional con el valor predeterminado".

Nota: Puede usar parámetros opcionales posicionales o parámetros opcionales con nombre, pero no ambos en la misma función o método. Lo siguiente no está permitido.

thisFunctionWontWork(String foo, [String positonal], {String named}) {
  // will not work!
}
Seth Ladd
fuente
44
? El operador ha quedado en desuso. Solo he encontrado la escala == condición nula en el tutorial de dardos. (expr1? expr2: expr3 todavía funciona)
Zdeněk Mlčoch
1
Amando los múltiples parámetros nombrados para una función, ¡fue difícil de encontrar! ¿Se vería aún mejor en la parte de constructores de documentos? ;)
willsquire
1
Los valores predeterminados ahora deben especificarse con en =lugar de :, de acuerdo con dartlang.org/guides/language/… .
nbro
31

En Dart, según tengo entendido, el parámetro método se puede dar en dos tipos.

  • Parámetro requerido
  • Parámetro opcional (posicional, con nombre y predeterminado)

>> Parámetro requerido

El parámetro requerido es un parámetro de estilo antiguo bien conocido que todos conocemos

ejemplo :

findVolume(int length, int breath, int height) {
 print('length = $length, breath = $breath, height = $height');
}

findVolume(10,20,30);

salida:

length = 10, breath = 20, height = 30

>> Parámetro posicional opcional

el parámetro se revelará con corchetes [] y los parámetros entre corchetes son opcionales.

ejemplo:

findVolume(int length, int breath, [int height]) {
 print('length = $length, breath = $breath, height = $height');
}

findVolume(10,20,30);//valid
findVolume(10,20);//also valid

salida:

length = 10, breath = 20, height = 30
length = 10, breath = 20, height = null // no value passed so height is null

>> Parámetro con nombre opcional

  • el parámetro se divulgará con una llave {}
  • Los parámetros entre corchetes son opcionales.
  • tiene que usar el nombre del parámetro para asignar un valor que se separó con colan :
  • en orden de parámetros entre corchetes no importa
  • Estos parámetros de tipo nos ayudan a evitar confusiones al pasar el valor de una función que tiene muchos parámetros.

ejemplo:

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

salida:

length = 10, breath = 20, height = 30
length = 10, breath = 20, height = null

>> Parámetro predeterminado opcional

  • igual que el parámetro con nombre opcional, además podemos asignar un valor predeterminado para este parámetro.
  • lo que significa que no se pasa ningún valor, se tomará este valor predeterminado.

ejemplo:

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 

salida:

length = 10, breath = 20, height = 30
length = 10, breath = 20, height = 10 // default value 10 is taken

gracias por la clara explicación dada por este enlace de video, créditos para el creador del video.

enlace de video: OpcionalPositionalParameters

enlace de video: OpcionalNamedParameters

enlace de video: OpcionalDefaultParameters

SaravanaRaja
fuente
3

Cuando el parámetro de una función se especifica utilizando la sintaxis "paramName: value", entonces es un parámetro con nombre. Dichos parámetros pueden hacerse opcionales encerrándolos entre [y] paréntesis. Se puede demostrar una demostración rudimentaria de esta función en el siguiente programa Hello World:

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

void main() {
  sayHello('Govind');
}
Balepur
fuente
2

De doc obtenemos que ambos positionaly los namedparámetros son opcionales, lo que significa que todos pueden estar ausentes.

En mi opinión, los namedparámetros son más estrictos que positionallos. Por ejemplo, si declara dicho método:

String say({String from, String msg})

Arriba fromy msgson namedparámetros, cuando llama al método saydebe usar say(from: "xx", msg: "xx"). Las llaves no pueden estar ausentes.

Sin embargo, si utiliza parámetros posicionales, es libre.

CoXier
fuente
El documento dice:> Los parámetros opcionales pueden ser nombrados o posicionales, pero no ambos. ¿Dónde dice que los parámetros posicionales son opcionales?
Markon
Un parámetro posicional es el estilo predeterminado de los parámetros en los lenguajes de programación, denominado posicional porque "es el primer parámetro, o el segundo, etc.". Namedlos parámetros se llaman así porque realmente puede identificarlos por nombre y no por posición (si cambia la posición de dos parámetros con nombre, no importa). Vea la respuesta anterior de Savaranaraja
Markon
0

Parámetros Posicionales:

Son los mismos que los parámetros predeterminados. Por ejemplo:

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

Aquí y tiene el valor predeterminado de 3

Parámetros nombrados:

Estos son parámetros que se pueden pasar en cualquier orden pasando el nombre del parámetro seguido del valor pasado. Por ejemplo:

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

Esta función se llama así:

sum(num1: 12, num2: 24);

Los parámetros también nombrados también pueden tener valores predeterminados.

Zohaib Hamdule
fuente