programowanieProgramista Backend

Czym są funkcje infix w Kotlinie, jak je deklarować i poprawnie używać, jakie istnieją ograniczenia? Podaj przykład stworzenia własnej funkcji infix i opowiedz o pułapkach.

Zdaj rozmowy kwalifikacyjne z asystentem AI Hintsage

Odpowiedź.

Funkcja infix to funkcja, którą można wywoływać w formie infix (bez kropki i nawiasów), co zwiększa czytelność kodu. Takie funkcje są wygodne, na przykład, do tworzenia DSL (języków specyficznych dla dziedzin).

Jak zadeklarować funkcję infix:

  • Funkcja musi być metodą klasy/funkcją rozszerzającą.
  • Musi mieć dokładnie jeden parametr.
  • Deklarowana jest za pomocą modyfikatora infix.
  • Nie dopuszcza się użycia vararg i wartości domyślnych dla parametru.

Przykład:

infix fun Int.add(x: Int): Int = this + x val result = 5 add 10 // 15

Zalety:

  • Zwiększenie czytelności, szczególnie w przypadku obliczeń lub łańcuchów wywołań.
  • Stosowanie do budowy kolekcji, sprawdzania warunków (na przykład, x to y).

Ograniczenia i pułapki:

  • Infix dostępny jest tylko dla metod z JEDNYM obowiązkowym parametrem.
  • Priorytet wykonywania infix jest niższy niż operatorów porównania i operatorów arytmetycznych (co czasami prowadzi do niespodzianek z priorytetem operacji).
  • Funkcja infix nie działa z parametrami domyślnymi i vararg.

Pytanie z podstępem.

Czy można używać funkcji infix z wieloma parametrami lub z parametrami domyślnymi?

Odpowiedź: Nie, nie można. Funkcja infix może mieć dokładnie jeden obowiązkowy parametr bez wartości domyślnej i bez vararg.

Przykład błędnej deklaracji:

// Błąd! infix fun foo(a: Int, b: Int) { }

Przykłady rzeczywistych błędów spowodowanych brakiem znajomości szczegółów tematu:


Historia

W projekcie próbowano wdrożyć funkcję infix, aby zastąpić wywołania funkcji budujących bardziej czytelnymi wyrażeniami infix. Z powodu braku wiedzy na temat ograniczeń dotyczących liczby parametrów funkcję zadeklarowano z dwoma parametrami — studenci długo nie mogli zrozumieć, dlaczego kompilacja się nie udaje.


Historia

Programista użył wyrażeń infix w dużym wyrażeniu arytmetycznym bez nawiasów, sądząc, że priorytet operacji jest taki sam jak w tradycyjnych operatorach matematycznych. W rezultacie wyrażenia obliczały się w sposób niezgodny z oczekiwaniami — trzeba było przepisać z wyraźnymi nawiasami.


Historia

Wewnątrz kolekcji zrealizowano parowanie za pomocą infix ("item to value") i stosowano zagnieżdżenie, jednak z powodu niedop理解anienia składni dwa zagnieżdżone wywołania infix nie zadziałały — zadziałało tylko przypisanie pary na najwyższym poziomie, zagnieżdżone pary zostały zignorowane, co doprowadziło do utraty istotnych danych.