Pierścienie

Ciekawym przypadkiem stanardowych 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 utworzyć sobie licznik oraz 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]

Super, teraz otrzymaliśmy 55 i jeśli zrobimy to jeszcze raz, to otrzymamy liczbę 59. Jednakże, jeśli zrobimy to kolejny raz, to wyskoczymy poza liczby znajdujące się w naszej liście i otrzymamy nil. A co jeśli chcieliśmy tylko zrobić 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 możesz używać 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 innnych funkcji, które pozwalają nam na tworzenie pierścieni.

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