Dart'da adlandırılmış ve konumsal parametreler arasındaki fark nedir?


146

Dart hem adlandırılmış isteğe bağlı parametreleri hem de konumsal isteğe bağlı parametreleri destekler. İkisi arasındaki farklar nelerdir?

Ayrıca, isteğe bağlı bir parametrenin gerçekten belirtilip belirtilmediğini nasıl anlayabilirsiniz?

Yanıtlar:


272

Dart'ın iki tür isteğe bağlı parametresi vardır: adlandırılmış ve konumsal . Farklılıkları tartışmadan önce, önce benzerlikleri tartışmama izin verin.

Dart'ın isteğe bağlı parametreleri isteğe bağlıdır , çünkü çağıranın işlevi çağırırken parametre için bir değer belirtmesi gerekmez.

İsteğe bağlı parametreler yalnızca gerekli parametrelerden sonra bildirilebilir.

İsteğe bağlı parametreler, arayan bir değer belirtmediğinde kullanılan varsayılan bir değere sahip olabilir.

Konumsal isteğe bağlı parametreler

Tarafından sarılmış bir parametre [ ]konumsal isteğe bağlı bir parametredir. İşte bir örnek:

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

Yukarıdaki kodda portisteğe bağlıdır ve varsayılan değeri vardır 80.

getHttpUrlÜçüncü parametre ile veya üçüncü parametre olmadan çağrı yapabilirsiniz .

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

Bir işlev için birden fazla konum parametresi belirtebilirsiniz:

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

İsteğe bağlı parametreler, belirtmek isterseniz atlayamayacağınız şekilde konumlandırılmıştır .portnumRetries

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

Tabii ki, 8080 ve 5'in ne olduğunu bilmiyorsanız, bu sihirli sayıların ne olduğunu söylemek zor. Daha okunabilir API'ler oluşturmak için adlandırılmış isteğe bağlı parametreleri kullanabilirsiniz .

Adlandırılmış isteğe bağlı parametreler

Tarafından sarılmış bir parametre { }, adlandırılmış isteğe bağlı bir parametredir. İşte bir örnek:

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

getHttpUrlÜçüncü parametre ile veya üçüncü parametre olmadan çağrı yapabilirsiniz . Sen gerekir işlevi çağrılırken parametre adı kullanın.

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

Bir işlev için birden çok adlandırılmış parametre belirtebilirsiniz:

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

Adlandırılmış parametrelere adla başvurulduğundan, bildirimlerinden farklı bir sırayla kullanılabilirler.

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

İsimlendirilmiş parametrelerin, özellikle boole bayrakları veya bağlam dışı numaralar olduğunda, anlaşılması kolay arama sitelerini sağladığına inanıyorum.

İsteğe bağlı parametrenin sağlandığını kontrol etme

Ne yazık ki, "isteğe bağlı bir parametre sağlanmadı" ve "varsayılan değerle isteğe bağlı bir parametre sağlandı" durumlarını ayırt edemezsiniz.

Not: Konum isteğe bağlı parametreleri veya adlandırılmış isteğe bağlı parametreleri kullanabilirsiniz, ancak her ikisi de aynı işlev veya yöntemde kullanamazsınız . Aşağıdakilere izin verilmez.

thisFunctionWontWork(String foo, [String positonal], {String named}) {
  // will not work!
}

4
? operatörü kullanımdan kaldırıldı. Dart eğitiminde sadece scale == null koşulu buldum. (ifade1? ifade2: ifade3 hala çalışıyor)
Zdeněk Mlčoch

1
Bir işlev için adlandırılmış birden çok parametreyi sevmek, bunu bulmak zordu! Dokümanların kurucuları bölümünde daha da iyi görünür müydü? ;)
willsquire

1
Varsayılan değerler artık birlikte belirtilmelidir =yerine :göre dartlang.org/guides/language/... .
nbro

31

Dart'da benim anlayışımla, yöntem parametresi iki tipte verilebilir.

  • Gerekli parametre
  • İsteğe bağlı parametre (konumsal, adlandırılmış ve varsayılan)

>> Gerekli Parametre

Gerekli parametre, hepimizin bildiği eski stil parametresidir

örnek :

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

findVolume(10,20,30);

çıktı:

length = 10, breath = 20, height = 30

>> Opsiyonel Konumsal Parametre

parametre köşeli parantez [] ile açıklanacaktır & köşeli parantez parametresi isteğe bağlıdır.

misal:

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

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

çıktı:

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

>> İsteğe Bağlı Adlandırılmış Parametre

  • parametresi, süslü ayraç {} ile açıklanacak
  • süslü parantez parametresi isteğe bağlıdır.
  • colan ile ayrılmış bir değer atamak için parametre adı kullanmanız gerekir :
  • kıvırcık parantez içinde parametre sırası önemli değil
  • bu tip parametresi, birçok parametresi olan bir işlev için değer iletirken karışıklığı önlememize yardımcı olur.

misal:

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

çıktı:

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

>> Opsiyonel Varsayılan Parametre

  • isteğe bağlı adlandırılmış parametre gibi aynı zamanda bu parametre için varsayılan değer atayabiliriz.
  • yani hiçbir değer iletilmez, bu varsayılan değer alınır.

misal:

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 

çıktı:

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

Bu video bağlantısından verilen net açıklama için teşekkürler, video oluşturucuya teşekkür ederiz.

video bağlantısı: İsteğe bağlıPositionalParameters

video bağlantısı: OptionalNamedParameters

video bağlantısı: İsteğe Bağlı Varsayılan Parametreler


3

Bir işlevin parametresi "paramName: value" sözdizimi kullanılarak belirtildiğinde, adlandırılmış bir parametredir. Bu parametreler, [ve] parantezler arasına alınarak isteğe bağlı hale getirilebilir. Bu fonksiyonun ilkel bir gösterimi aşağıdaki Hello World programında gösterilebilir:

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

void main() {
  sayHello('Govind');
}

2

Gönderen doc ikimizin de bunu almak positionalve namedparametreler hepsi mevcut olmayabilir anlamına gelir isteğe bağlıdır.

Benim düşünceme göre, namedparametreler daha katıdır positional. Örneğin, böyle bir yöntem beyan ederseniz:

String say({String from, String msg})

Üstü fromve msgvardır namedsen yöntemini çağırdığınızda, parametreler saykullanmak gerekir say(from: "xx", msg: "xx"). Anahtarlar bulunamaz.

Ancak konumsal parametreler kullanıyorsanız, özgürsünüz.


Doc diyor ki:> İsteğe bağlı parametreler adlandırılabilir veya konumlandırılabilir, ancak her ikisi birden olamaz. Konumsal parametrelerin isteğe bağlı olduğu nerede söylenir?
Markon

Konumsal parametre, programlama dillerinde "birinci parametre veya ikinci vb." Olduğu için konumsal olarak adlandırılan varsayılan parametre stilidir. Namedparametreleri böyle adlandırılır, çünkü bunları konuma göre değil, ada göre tanımlayabilirsiniz (adlandırılmış iki parametrenin konumunu değiştirirseniz, önemli değildir). Yukarıdaki yanıta bakınız: Savaranaraja
Markon

0

Konumsal Parametreler:

Varsayılan parametrelerle aynıdır. Örneğin:

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

Burada y varsayılan değeri 3'tür

Adlandırılmış Parametreler:

Bunlar, parametrenin adı ve ardından iletilen değer iletilerek herhangi bir sırayla geçirilebilen parametrelerdir. Örneğin:

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

Bu işleve şöyle denir:

sum(num1: 12, num2: 24);

Ayrıca adlandırılmış parametrelerin de varsayılan değerleri olabilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.