Pierścienie

Ciekawym przypadkiem standardowych list są pierścienie. Jeśli znasz się trochę na programowaniu, to mogło się zdarzyć, że miałeś do czynienia z buforami cyklicznymi lub tablicami cyklicznymi. Tutaj przyjrzymy się tylko pierścieniowi - jest krótki i prosty.

W poprzedniej sekcji dotyczącej list widzieliśmy, w jaki sposób możemy wyciągać z nich elementy, korzystając z mechanizmu indeksowania:

puts [52, 55, 59][1]

A co się stanie, jeśli chciałbyś pozycję spod indeksu 100? Dobrze, więc na pozycji 100 nie ma żadnego elementu, jako że lista posiada w sobie tylko trzy elementy. Sonic Pi zwróci więc wartość nil, co oznacza nic.

Jednakże biorąc pod uwagę, że masz licznik taki, jak aktualne uderzenie, które nieustannie rośnie. Spróbujmy go utworzyć oraz do tego listę:

counter = 0
notes = [52, 55, 59]

Możemy teraz użyć naszego licznika, aby dostać się do nuty znajdującej się w naszej liście:

puts notes[counter]

Super, otrzymaliśmy 52! Teraz, spróbujmy zwiększyć nasz licznik i dostać się do kolejnej nuty:

counter = (inc counter)
puts notes[counter]

Wspaniale, teraz otrzymaliśmy 55 i jeśli dokonamy tego jeszcze raz, otrzymamy liczbę 59. Jednakże jeśli to zrobimy, wyskoczymy poza liczby znajdujące się w naszej liście i otrzymamy nil. A co, jeśli chcieliśmy tylko stworzyć pętlę, wrócić do początku i zacząć na samym początku listy od nowa? Do tego właśnie służą pierścienie.

Tworzenie Pierścieni

Możemy tworzyć pierścienie na dwa sposoby. Albo użyjemy funkcji ring, podając elementy dla danego pierścienia jako parametry:

(ring 52, 55, 59)

Albo możemy wziąć normalną listę i przekształcić ją w pierścień poprzez wysłanie do niej wiadomości .ring:

[52, 55, 59].ring

Indeksowanie Pierścieni

Gdy już masz pierścień, możesz go używać dokładnie w ten sam sposób, w jaki używasz normalnej listy, z tym jednym wyjątkiem, że masz możliwość korzystania z indeksów ujemnych oraz takich, które są większe niż ilość elementów w danym pierścieniu, a będą one powtarzać się cyklicznie i zawsze będą wskazywać na jeden z elementów pierścienia:

(ring 52, 55, 59)[0] #=> 52
(ring 52, 55, 59)[1] #=> 55
(ring 52, 55, 59)[2] #=> 59
(ring 52, 55, 59)[3] #=> 52
(ring 52, 55, 59)[-1] #=> 59

Korzystanie z Pierścieni

Przyjmijmy, że używamy zmiennej do reprezentacji aktualnego numeru uderzenia. Możemy użyć jej jako indeksu w naszym pierścieniu, aby wydobywać kolejne nuty do zagrania, czasy zanikania albo cokolwiek innego przydatnego, co załadowaliśmy do naszego pierścienia, niezależnie od numeru uderzenia (beat), przy którym aktualnie się znajdujemy.

Skale i Akordy są Pierścieniami

Przydatną rzeczą jest wiedza o tym, że listy zwracane przez skale scale oraz akordy chord są również pierścieniami i pozwalają Ci na dostęp do nich z wykorzystaniem bezwzględnych indeksów.

Konstruktory Pierścieni

Oprócz funkcji ring istnieje również kilka innych funkcji, które pozwalają nam na tworzenie pierścieni.

Przyjrzyj się poszczególnym dokumentacjom dla uzyskania większej ilości informacji.