Menu
Coddy logo textTech

Rekordy (Dart 3)

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

Dart 3 wprowadził rekordy — lekki sposób na grupowanie wielu wartości bez tworzenia pełnej klasy. Rekordy są niezmienne, mają wbudowane porównywanie równości i idealnie nadają się do zwracania wielu wartości z funkcji lub tymczasowego grupowania powiązanych danych.

Utwórz rekord, umieszczając wartości w nawiasach:

void main() {
  // Prosta krotka z dwiema wartościami
  var point = (10, 20);
  print(point.$1);  // 10 - dostęp do pierwszego elementu
  print(point.$2);  // 20 - dostęp do drugiego elementu
  
  // Krotki z polami nazwanymi
  var person = (name: 'Alice', age: 30);
  print(person.name);  // Alice
  print(person.age);   // 30
}

Do pól pozycyjnych odwołujesz się za pomocą $1, $2 itd., a pola nazwane wykorzystują bezpośrednio swoje nazwy. W jednym rekordzie możesz łączyć oba style.

Krotki świetnie sprawdzają się przy zwracaniu wielu wartości z funkcji — nie trzeba tworzyć klasy tylko po to, by zwrócić dwa elementy danych:

(int, int) divideWithRemainder(int a, int b) {
  return (a ~/ b, a % b);
}

(String name, int age) getUser() {
  return ('Bob', 25);
}

void main() {
  var (quotient, remainder) = divideWithRemainder(17, 5);
  print('$quotient remainder $remainder');  // 3 reszta 2
  
  var (name, age) = getUser();
  print('$name is $age');  // Bob ma 25 lat
}

Rekordy automatycznie obsługują porównywanie równości na podstawie swoich wartości, dzięki czemu można wygodnie je porównywać bez samodzielnego implementowania ==. Używaj rekordów, gdy potrzebujesz prostych, niezmiennych grup danych; używaj klas, gdy potrzebujesz metod, mutowalności lub bardziej złożonego zachowania.

challenge icon

Wyzwanie

Łatwy

Zbudujmy układ współrzędnych przy użyciu rekordów! Utworzysz funkcje, które działają z punktami 2D reprezentowanymi jako rekordy, pokazując, jak rekordy ułatwiają zwracanie i przetwarzanie wielu powiązanych wartości bez tworzenia pełnych klas.

Podzielisz kod na dwa pliki:

  • geometry.dart: Utwórz funkcje, które używają rekordów do pracy z danymi współrzędnych:
    • Funkcję createPoint(int x, int y), która zwraca rekord z nazwanymi polami x i y. Typem zwracanym powinno być ({int x, int y})
    • Funkcję midpoint(({int x, int y}) p1, ({int x, int y}) p2), która oblicza i zwraca środek między dwoma punktami jako rekord z nazwanymi polami. Do obliczeń użyj dzielenia całkowitoliczbowego (~/)
    • Funkcję distance(({int x, int y}) p1, ({int x, int y}) p2), która zwraca rekord z polami pozycyjnymi: odległość poziomą (różnicę x) i odległość pionową (różnicę y). Typem zwracanym powinno być (int, int). Oblicz je jako p2.x - p1.x oraz p2.y - p1.y
  • main.dart: Zaimportuj plik z geometrią i pokaż rekordy w działaniu:
    • Utwórz dwa punkty za pomocą createPoint: punkt A w (2, 4) i punkt B w (10, 8)
    • Wypisz Point A: ([x], [y]), używając nazwanych pól
    • Wypisz Point B: ([x], [y]), używając nazwanych pól
    • Oblicz środek i wypisz Midpoint: ([x], [y])
    • Oblicz odległość i użyj destrukturyzacji, aby wyodrębnić wartości do zmiennych dx i dy, a następnie wypisz Distance: dx=[dx], dy=[dy]

Zauważ, jak rekordy pozwalają przejrzyście zwracać wiele wartości — używaj nazwanych pól dla jasności, gdy znaczenie ma znaczenie, a pól pozycyjnych, gdy kontekst jest oczywisty!

Oczekiwany wynik:

Point A: (2, 4)
Point B: (10, 8)
Midpoint: (6, 6)
Distance: dx=8, dy=4

Spróbuj swoich sił

import 'geometry.dart';

void main() {
  // TODO: Utwórz punkt A w (2, 4) za pomocą createPoint
  
  // TODO: Utwórz punkt B w (10, 8) za pomocą createPoint
  
  // TODO: Wypisz punkt A, używając nazwanych pól: Punkt A: ([x], [y])
  
  // TODO: Wypisz punkt B, używając nazwanych pól: Punkt B: ([x], [y])
  
  // TODO: Oblicz punkt środkowy i wypisz: Punkt środkowy: ([x], [y])
  
  // TODO: Oblicz odległość i użyj destrukturyzacji, aby przypisać wartości do dx i dy
  // Następnie wypisz: Distance: dx=[dx], dy=[dy]
}
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