2012-11-07 21 views

cevap

39

Dart iki tür isteğe bağlı parametreye sahiptir: ve konumsal. Farklılıkları tartışmadan önce, benzerlikleri tartışalım.

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

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

İsteğe bağlı parametreler, bir arayan 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, bir konumsal isteğe bağlı bir parametredir. Yukarıdaki kodda

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

port isteğe bağlıdır ve 80 varsayılan değeri vardır: İşte bir örnek.

Üçüncü parametre ile veya olmadan, getHttpUrl numaralı telefonu arayabilirsiniz.

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

Bir işlev için birden konumsal parametreleri belirtebilirsiniz:

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

opsiyonel parametreler ki pozisyonel sen numRetries belirtmek istiyorsanız port geçemeyeceğim. Tabii

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

, bunu bu görünüşte sihirli sayıların ne söylemek zor, 8080 ve 5 ne bilmedikçe. Daha okunabilir API'ler oluşturmak için seçmeli parametreleri kullanabilirsiniz.

Named isteğe bağlı parametreler

{ } tarafından sarılmış bir parametre adlandırılmış isteğe bağlı bir parametredir.

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

birlikte veya üçüncü parametre olmadan getHttpUrl çağırabilirsiniz: İşte bir örnek. , işlevi çağırırken parametre adını kullanmalısınız.

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

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

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

adlandırılmış parametreleri adıyla başvurulan Çünkü onların beyanı farklı bir sırayla kullanılabilir.

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

Ben boolean bayrakları veya dışı bağlam numaraları vardır, özellikle, adlandırılmış parametreleri daha kolay anlaşılır çağrı siteleri için yapmak inanıyoruz. isteğe bağlı parametre Maalesef durumlarda "isteğe bağlı parametre sağlanmadı" ve "isteğe bağlı parametre varsayılan değeri ile sağlandı" ayırt edemez

sağlandı eğer

denetleniyor.

Not: Sen pozisyonel isteğe bağlı parametreleri veya adında isteğe bağlı parametreleri, fakat aynı işlevin veya yöntemin hem kullanabilir. Aşağıdakilere izin verilmez.

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

? operatör kullanımdan kaldırılmıştır. Dart öğreticisinde sadece scale == null durumunu buldum. (expr1? expr2: expr3 hala çalışıyor) –

+0

Bir işlev için birden çok adlandırılmış paramları sevmek, bu bulmak zordu! Dokümanların kurucu bölümünde daha iyi görünüyor muydu? ;) – willsquire

+0

Varsayılan değerler şimdi https://www.dartlang.org/guides/language/language-tour#optional-positional-parameters adresine göre '=' yerine '=' ile belirtilmelidir. – nbro

İlgili konular