Menu
Coddy logo textTech

Operatory uwzględniające null

Część sekcji Programowanie obiektowe ścieżki Dart w Coddy. Lekcja 27 z 110.

Oprócz ?. i ! Dart udostępnia dodatkowe operatory, które pozwalają zwięźlej pracować z wartościami dopuszczającymi wartość null. Te operatory uwzględniające null pomagają pisać czytelniejszy kod podczas obsługi potencjalnych wartości null.

Operator koalescencji null ?? zwraca lewą wartość, jeśli nie jest null, w przeciwnym razie zwraca prawą wartość:

String? nickname;
String displayName = nickname ?? 'Guest';
print(displayName);  // Guest

nickname = 'Alex';
displayName = nickname ?? 'Guest';
print(displayName);  // Alex

Operator przypisania uwzględniający null ??= przypisuje wartość tylko wtedy, gdy zmienna ma obecnie wartość null:

String? username;
username ??= 'Anonymous';
print(username);  // Anonymous

username ??= 'NewName';
print(username);  // Nadal Anonymous (nie było null)

Możesz łączyć operator dostępu uwzględniający wartości null ?. dla zagnieżdżonych właściwości:

String? city = user?.address?.city;  // Bezpieczne, nawet jeśli user lub address ma wartość null

Te operatory dobrze ze sobą współpracują. Na przykład możesz uzyskać dostęp do właściwości dopuszczającej wartość null i podać wartość domyślną:

String greeting = user?.name ?? 'Stranger';
// Jeśli user jest null LUB user.name jest null, użyj 'Stranger'

Używanie tych operatorów sprawia, że kod pozostaje czytelny, a jednocześnie zapewnia bezpieczeństwo obsługi wartości null w całym programie.

challenge icon

Wyzwanie

Łatwy

Stwórzmy system rejestracji gości, który pokazuje, jak operatory obsługujące wartości null mogą uprościć kod podczas pracy z opcjonalnymi informacjami.

Podzielisz kod na dwa pliki:

  • guest.dart: Zdefiniuj klasę Guest, która reprezentuje osobę uczestniczącą w wydarzeniu. Niektórzy goście podają wszystkie dane, a inni tylko podstawowe informacje. Twoja klasa powinna zawierać:
    • Nieprzyjmującą wartości null zmienną String name — każdy gość musi mieć imię
    • Przyjmującą wartość null zmienną String? email — nie każdy podaje adres e-mail
    • Przyjmującą wartość null zmienną String? dietaryPreference — niektórzy goście nie określają wymagań żywieniowych
    • Konstruktor, który przyjmuje name jako wymagany parametr
    • Metodę getDisplayEmail(), która zwraca adres e-mail, jeśli jest dostępny, lub 'No email provided', używając operatora ??
    • Metodę assignDefaultDiet(), która ustawia dietaryPreference na 'Standard' tylko wtedy, gdy jego bieżąca wartość to null, używając operatora ??=
    • Metodę getEmailDomain(), która zwraca długość adresu e-mail, używając ?., lub null, jeśli adres e-mail nie istnieje
    • Metodę printBadge(), która wyświetla informacje z identyfikatora gościa
  • main.dart: Zaimportuj klasę gościa i zarejestruj trzech gości o różnym poziomie wypełnienia danych:
    • Utwórz gościa o imieniu 'Alice', ustaw jej adres e-mail na 'alice@company.com', a wymagania żywieniowe na 'Vegetarian'
    • Utwórz gościa o imieniu 'Bob', ustaw tylko jego adres e-mail na 'bob@email.org' (pozostaw wymagania żywieniowe jako null)
    • Utwórz gościa o imieniu 'Charlie' (pozostaw zarówno adres e-mail, jak i wymagania żywieniowe jako null)
    • Wywołaj assignDefaultDiet() dla wszystkich trzech gości
    • Dla każdego gościa, w podanej kolejności, wywołaj printBadge(), a następnie wyświetl Email length: [result], używając getEmailDomain()

Metoda printBadge() powinna wyświetlać informacje w następującym formacie:

=== Guest Badge ===
Name: [name]
Email: [getDisplayEmail()]
Diet: [dietaryPreference or "Not specified"]

Zauważ, że wymagania żywieniowe Alice pozostają ustawione na 'Vegetarian', ponieważ ??= przypisuje wartość tylko wtedy, gdy bieżąca wartość to null, podczas gdy Bob i Charlie otrzymują domyślną dietę 'Standard'.

Oczekiwany wynik:

=== Guest Badge ===
Name: Alice
Email: alice@company.com
Diet: Vegetarian
Email length: 17
=== Guest Badge ===
Name: Bob
Email: bob@email.org
Diet: Standard
Email length: 13
=== Guest Badge ===
Name: Charlie
Email: No email provided
Diet: Standard
Email length: null

Spróbuj swoich sił

import 'guest.dart';

void main() {
  // TODO: Utwórz gościa o imieniu 'Alice'
  // Ustaw jej adres e-mail na 'alice@company.com'
  // Ustaw jej preferencję żywieniową na 'Vegetarian'

  // TODO: Utwórz gościa o imieniu 'Bob'
  // Ustaw tylko jego adres e-mail na 'bob@email.org'
  // Pozostaw preferencję żywieniową jako null

  // TODO: Utwórz gościa o imieniu 'Charlie'
  // Pozostaw zarówno adres e-mail, jak i preferencję żywieniową jako null

  // TODO: Wywołaj assignDefaultDiet() dla wszystkich trzech gości

  // TODO: Dla każdego gościa w podanej kolejności (Alice, Bob, Charlie):
  // - Wywołaj printBadge()
  // - Wypisz 'Email length: [result]', używając getEmailDomain()
}
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator Dart online