Przerzutnik (programowanie)

W programowaniu komputerowym przerzutnik jest rzadko używaną konstrukcją składniową, która umożliwia zmianę wartości logicznej z fałszu na prawdę, gdy spełniony jest pierwszy warunek, a następnie z powrotem na fałsz, gdy spełniony jest drugi warunek . Składnia jest dostępna w językach programowania Perl i Ruby . Podobna logika jest dostępna w sed i awk .

Przerzutnik z pierwszym warunkiem A i drugim warunkiem B nie jest równoważny z „jeśli A i nie B”, ponieważ ten pierwszy ma stan trwały i jest prawdziwy, nawet jeśli A nie jest już prawdziwy, o ile w pewnym momencie w przeszłości A było prawdziwe, a B zawsze było fałszywe.

Przykład

Poniższy kod Ruby drukuje liczby od 4 do 6:

(1..10).każdy robi |x| stawia x jeśli (x == 4 .. x == 6) koniec

Pierwszym wystąpieniem „..” jest operator zakresu , który tworzy wyliczenie liczb całkowitych od 1 do 10. Drugim „..” jest operator przerzutnika, inaczej znany jako przerzutnik. Zauważ, że liczba 5 jest drukowana, mimo że zarówno „x == 4”, jak i „x== 6” są fałszywe. Dzieje się tak, ponieważ wyrażenie pamięta, że ​​„x == 4” było prawdziwe w poprzedniej iteracji, a „x == 6” w tym momencie nigdy nie było prawdziwe.

Pułapki

Operator przerzutnika musi przechowywać swój aktualny stan. Programista nie ma możliwości jednoznacznego zdefiniowania, gdzie ten stan jest przechowywany i jaki jest jego czas życia. Czas życia ma znaczenie, gdy ten sam kod jest używany przez kilka wątków lub w funkcjach rekurencyjnych. Te równoczesne dostępy do stanu operatora przerzutnika mogą prowadzić do niezdefiniowanego zachowania lub przynajmniej zaskakujących wyników, w zależności od języka programowania. Na przykład w Perlu każdy operator przerzutnika ma swój własny stan, wspólny dla wszystkich wątków, inne języki programowania robią to samo.

Aby obejść to ograniczenie, operator przerzutnika musiałby być modelowany jako abstrakcyjny typ danych sparametryzowany za pomocą:

  • predykat, który mówi, czy włączyć przerzutnik,
  • predykat, który mówi, czy wyłączyć przerzutnik.

Ten typ danych flip-flop zapewniałby funkcję, która jednocześnie wysyła zapytania i aktualizuje swój stan. Ta funkcja pobiera rzeczywiste dane, od których zależą predykaty przełączania, i przekazuje te dane do dwóch predykatów, jeśli to konieczne.

Ze względu na tę nieodłączną złożoność tylko kilka języków programowania przyjęło operator przerzutnika.

  1. ^ a b „Operatory Perla i pierwszeństwo” . Źródło 2016-10-21 .
  2. ^ Nithin Bekal (2014-11-21). „Operator flip flop w języku Ruby” .
  3. ^ „PyCon Australia Lightning talk: Flip Flop Operators (flip floperators)” . 2018-08-26.
  4. ^ „Operator zakresu w Perlu” . 2020-08-16.