Apa perbedaan antara parameter bernama dan posisi di Dart?

145

Dart mendukung parameter opsional bernama dan parameter opsional posisional. Apa perbedaan antara keduanya?

Juga, bagaimana Anda bisa tahu apakah parameter opsional benar-benar ditentukan?

Seth Ladd
sumber

Jawaban:

272

Dart memiliki dua jenis parameter opsional: bernama dan posisional . Sebelum saya membahas perbedaannya, izinkan saya terlebih dahulu membahas persamaannya.

Parameter opsional Dart adalah opsional karena penelepon tidak diharuskan menentukan nilai parameter saat memanggil fungsi.

Parameter opsional hanya dapat dinyatakan setelah parameter yang diperlukan.

Parameter opsional dapat memiliki nilai default, yang digunakan ketika penelepon tidak menentukan nilai.

Parameter opsional posisi

Parameter yang dibungkus oleh [ ]adalah parameter opsional posisi. Berikut ini sebuah contoh:

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

Dalam kode di atas, portbersifat opsional dan memiliki nilai default 80.

Anda dapat menelepon getHttpUrldengan atau tanpa parameter ketiga.

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

Anda dapat menentukan beberapa parameter posisi untuk suatu fungsi:

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

Parameter opsional bersifat posisional di mana Anda tidak dapat menghilangkan portjika Anda ingin menentukan numRetries.

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

Tentu saja, kecuali Anda tahu apa 8080 dan 5, sulit untuk mengatakan apa angka-angka ajaib itu. Anda dapat menggunakan parameter opsional bernama untuk membuat API lebih mudah dibaca.

Dinamai parameter opsional

Parameter yang dibungkus oleh { }adalah parameter opsional bernama. Berikut ini sebuah contoh:

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

Anda dapat menelepon getHttpUrldengan atau tanpa parameter ketiga. Anda harus menggunakan nama parameter saat memanggil fungsi.

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

Anda dapat menentukan beberapa parameter bernama untuk suatu fungsi:

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

Karena parameter bernama direferensikan oleh nama, mereka dapat digunakan dalam urutan yang berbeda dari deklarasi mereka.

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

Saya percaya parameter bernama membuat situs panggilan lebih mudah dipahami, terutama ketika ada boolean flag atau nomor di luar konteks.

Memeriksa apakah parameter opsional disediakan

Sayangnya, Anda tidak dapat membedakan antara case "parameter opsional tidak disediakan" dan "parameter opsional diberikan dengan nilai default".

Catatan: Anda dapat menggunakan parameter opsional posisi atau parameter opsional bernama, tetapi tidak keduanya dalam fungsi atau metode yang sama. Berikut ini tidak dibolehkan.

thisFunctionWontWork(String foo, [String positonal], {String named}) {
  // will not work!
}
Seth Ladd
sumber
4
? Operator sudah usang. Saya hanya menemukan skala == kondisi nol dalam tutorial panah. (expr1? expr2: expr3 masih berfungsi)
Zdeněk Mlčoch
1
Mencintai beberapa param bernama untuk suatu fungsi, ini sulit ditemukan! Akan terlihat lebih baik di bagian konstruktor dari dokumen? ;)
meminta
1
Nilai default sekarang harus ditentukan dengan =bukan :, menurut dartlang.org/guides/language/… .
nbro
31

Di Dart dengan pemahaman saya, parameter metode dapat diberikan dalam dua jenis.

  • Parameter yang diperlukan
  • Parameter opsional (posisi, bernama & default)

>> Parameter yang Diperlukan

Parameter yang diperlukan adalah parameter gaya lama yang sudah kita ketahui

contoh :

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

findVolume(10,20,30);

keluaran:

length = 10, breath = 20, height = 30

>> Parameter Posisi Opsional

parameter akan diungkapkan dengan kurung siku [] & parameter kurung siku adalah opsional.

contoh:

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

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

keluaran:

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

>> Parameter Bernama Opsional

  • parameter akan diungkapkan dengan braket keriting {}
  • parameter kurung kurawal adalah opsional.
  • harus menggunakan nama parameter untuk menetapkan nilai yang dipisahkan dengan colan :
  • dalam urutan parameter kurung kurung tidak masalah
  • parameter tipe ini membantu kita untuk menghindari kebingungan saat memberikan nilai untuk fungsi yang memiliki banyak parameter.

contoh:

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

keluaran:

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

>> Parameter Default Opsional

  • sama seperti parameter bernama opsional selain itu kita dapat menetapkan nilai default untuk parameter ini.
  • yang berarti tidak ada nilai yang diteruskan, nilai default ini akan diambil.

contoh:

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 

keluaran:

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

terima kasih atas penjelasan jelas yang diberikan dari tautan video ini, kredit kepada pembuat video.

tautan video: Parameter OpsionalPositional

tautan video: OptionalNamedParameters

tautan video: OptionalDefaultParameters

SaravanaRaja
sumber
3

Ketika parameter fungsi ditentukan menggunakan sintaks "paramName: value", maka itu adalah parameter bernama. Parameter tersebut dapat dibuat opsional dengan melampirkannya di antara [dan] tanda kurung. Demonstrasi dasar dari fungsi ini dapat ditunjukkan dalam program Hello World berikut:

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

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

Dari dokumen, kami mendapatkan bahwa keduanya positionaldan namedparameter bersifat opsional, yang berarti semuanya tidak ada.

Menurut pendapat saya, namedparameter lebih ketat daripada positionalyang. Misalnya, jika Anda mendeklarasikan metode seperti itu:

String say({String from, String msg})

Di atas fromdan msgmerupakan namedparameter, saat Anda memanggil metode sayyang harus Anda gunakan say(from: "xx", msg: "xx"). Kunci tidak dapat absen.

Namun jika Anda menggunakan parameter posisi, Anda bebas.

KoXier
sumber
Dokumen mengatakan:> Parameter opsional dapat dinamai atau posisional, tetapi tidak keduanya. Di mana dikatakan bahwa parameter posisi opsional?
Markon
Parameter posisional adalah gaya default parameter dalam bahasa pemrograman, disebut posisional karena "itu adalah parameter pertama, atau kedua, dll". Namedparameter disebut seperti itu karena Anda benar-benar dapat mengidentifikasinya berdasarkan nama dan bukan berdasarkan posisi (jika Anda mengganti posisi dua param yang bernama, tidak masalah). Lihat jawaban di atas dari Savaranaraja
Markon
0

Parameter Posisi:

Mereka sama dengan parameter default. Sebagai contoh:

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

Di sini y memiliki nilai default 3

Parameter yang Dinamai:

Ini adalah parameter yang dapat dilewati dalam urutan apa pun dengan melewati nama parameter diikuti oleh nilai yang dikirimkan. Sebagai contoh:

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

Fungsi ini disebut seperti ini:

sum(num1: 12, num2: 24);

Parameter yang dinamai juga dapat memiliki nilai default.

Zohaib Hamdule
sumber