Dart boş kontrol deyimi veya en iyi uygulama nedir?


85

Haritalarımda çift aramalardan kaçınmak için aşağıdaki atama ve boş kontrol biçimlerine sahibim.
Bunu Dart'ta yapmanın daha iyi veya daha deyimsel bir yolu var mı?

bool isConnected(a, b){
  List list;
  return (
    ((list = outgoing[a]) != null && list.contains(b)) ||
    ((list = incoming[a]) != null && list.contains(b))
  );
}

Yanıtlar:


120

Dart 1.12'den itibaren, bu tür durumlar için boşa duyarlı operatörler mevcuttur:

bool isConnected(a, b) {
  bool outConn = outgoing[a]?.contains(b) ?? false;
  bool inConn = incoming[a]?.contains(b) ?? false;
  return outConn || inConn;
}

?.Sol taraftaki boş olduğunu ve eğer null operatör kısa devre ??o boş değildir ve sağ taraf aksi takdirde operatör sol tarafını döner.

İfade

outgoing[a]?.contains(b)

böylece birine değerlendirecek nulleğer outgoing[a]olduğunu null, ya da boole sonucu contains(b)Değilse.

Bu, ortaya çıkan ifadenin aşağıdakilerden biri olacağı anlamına gelir:

bool outConn = null ?? false; // false
bool outConn = false ?? false; // false
bool outConn = true ?? false; // true

Aynısı inConnboole için de geçerlidir , yani ikisinin de boş olmaması garanti edilir inConnve ikisinin outConnsonucunu döndürmemize izin verir ||.


Yazmak outgoing[a]?.contains(b)tehlikelidir, en azından Groovy anlambilimiyle, çünkü olduğu zaman outgoing, nulltüm ifade değerlendirilir null. Böylece, aslında return (null || true)kontrol moduna geçecek gibi bir şey elde edebilirsiniz .
Ladicek

Açık sorun bağlantısı için teşekkürler.
z5h

@Ladicek Bunu işaret ettiğiniz için teşekkürler. ??Bu sorunu hesaba katmak için boş birleştirme operatörünü ( ) güncellenmiş cevabıma dahil ettim.
Pixel Elephant


Nesne Alanlarını kontrol etmek için sadece yazın object?.field ?? true. İstediğiniz herhangi bir şeyin gerçek olabileceği yerde.
Tilo

50

Artık 4 boşa duyarlı operatör var

?? konu boş ise bir varsayılan sağlar

return subject ?? "defaultIfNull";

?? = konuyu sadece konu boş ise varsayılana ayarlar

Bu, ?? ancak konu değişkenini boş ise varsayılana ayarlar.

subject ??= "defaultIfNull";

?. öznenin özelliğine erişirken özne boşsa istisnadan kaçının

object?.xnesne boşsa null döndürür, nesne boşsa object.xbir istisnaya neden olur

...? yayılmış bir koleksiyondan, konu listesi boşsa son listede boş bir öğeden kaçının

aşağıdakilerin sonucu

[
  ...[1, 2],
  null,
]

dır-dir [1, 2, null]

boş değer kullanmaktan kaçınmak için ...?

var resultingList = [
  ...[1, 2],
  ...?subjectList,
];

2
Kullanmayla ilgili önemli bir açıklama ? : boş değer atanabilir başvuru avoid yöntemine sahipse method(), aşağıdaki sözdizimi a?.method();yöntemi yalnızca aboş değilse çalıştırır .
Alex Semeniuk

@AlexSemeniuk, harika nokta! ama böyle bir şeyi yapmanın herhangi bir yolu var mı >>> a boş değilse ... o zaman bir XYZ () yöntemini çalıştırın, bu yöntem a nesnesinin sınıfının bir üyesi değilse ???
Yo Apps

@YoApps Sınıf imzasının bir parçası olmayan bir yöntemi yürütmek istediğinizi açıkça anladım mı? Bildiğim herhangi bir OOP dilinde yapmak mümkün değil.
Alex Semeniuk

@AlexSemeniuk evet ben de denedim, işe yaramadı o kadar eskiye döndümif(a!=null){XYZ();}
Yo Apps

1
@YoApps. Oh, bu kodu kastediyorsun. Hayır, Dart'ta mümkün değil.
Alex Semeniuk

15

Başlığı arayarak buraya geldiğimde aşağıdakileri yayınlıyorum.

Https://github.com/dart-lang/sdk/issues/66 uyarınca , "Dart boş kontrol deyimi veya en iyi uygulama nedir?" dır-dir:

Genel durumda boş kontrol deyimi veya en iyi uygulama yoktur. Boşluk farkında operatörler sizin durumunuza uymuyorsa, if (object == null)veya if (object != null).


1
onlar :-) şimdi isteğe bağlı öğeleri var
Oliver Dixon

0
bool ok<T>(T obj) => obj != null;
bool nul<T>(T obj) => obj == null;

Bu kod soruyu yanıtlayabilirken, bu kodun soruyu neden ve / veya nasıl yanıtladığına ilişkin ek bağlam sağlamak, uzun vadeli değerini artırır. Nasıl Cevaplanır . Saygılarımla.
Elletlar
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.