8.5 Ring Kettingen

# Ring Kettingen

Als toevoeging tot de bouwers zoals `range`en `spread`is het manipuleren van bestaande ringen, een andere manier om nieuwe ringen te maken.


## Ketting Commando's

Neem deze eenvoudige ring om dit te verkennen:

```
(ring 10, 20, 30, 40, 50)
```

Wat als we deze andersom willen? Dan kunnen we het chain commando `.reverse nemen om de ring om te draaien:

```
(ring 10, 20, 30, 40, 50).reverse  #=> (ring 50, 40, 30, 20, 10)
```

En wat als we de eerste drie waarden van de ring willen nemen?

```
(ring 10, 20, 30, 40, 50).take(3)  #=> (ring 10, 20, 30)
```

En wat als we de ring willen verschuiven?

```
(ring 10, 20, 30, 40, 50).shuffle  #=> (ring 40, 30, 10, 50, 20)
```

## Meerdere Kettingen

Dit is al een krachtige manier om nieuwe ringen te creëren. De *echte* kracht komt wanneer je een paar van deze opdrachten samen chaint.

Wat denk je ervan de ring te shuffelen, 1 element te laten vallen en vervolgens de volgende 3 te nemen?

Laten we dit in fasen doen:

1. `(ring 10, 20, 30, 40, 50)` - our initial ring
2. `(ring 10, 20, 30, 40, 50).shuffle` - shuffles - `(ring 40, 30, 10, 50, 20)`
3. `(ring 10, 20, 30, 40, 50).shuffle.drop(1)` - drop 1 - `(ring 30, 10, 50, 20)`
4. `(ring 10, 20, 30, 40, 50).shuffle.drop(1).take(3)` - take 3 - `(ring 30, 10, 50)`

Kan je nu zien dat we een lange ketting van deze methoden kunnen gebruiken door deze *bij elkaar te plakken*. We kunnen deze in eender welke volgorde combineren en ontwikkellen hierbij een uiterst rijke en krachtige manier om nieuwe ringen van bestaande ringen te creëren.

## Onveranderbaarheid

Deze ringen hebben een krachtige en belangrijke eigenschap. Ze zijn onveranderlijk wat betekent dat je ze niet kunt veranderen. Dit betekent dat de chaining methode die in deze sectie beschreven word *ringen niet veranderd* maar eerder *nieuwe ringen maakt*. Dit betekent dat u vrij bent om te ringen te delen met threads en je hen kan beginnen chainen binnen een thread met de wetenschap dat je geen andere thread zal beïnvloeden die gebruik maakt van dezelfde ring.

## Beschikbare Chain Methoden

Hier is een lijst van de beschikbare chain methoden voor jou om mee te spelen:

* '.reverse' - geeft een omgekeerde versie van de ring
* '.sort' - creëert een gesorteerde versie van de ring
* '.shuffle' - creëert een geshuffelde versie van de ring
* `.pick` - geeft een ring met de resultaten van de aanroep `.choose` 1 keer
* '.pick(3)' - geeft een ring met de resultaten van de aanroep `.choose` 3 keer
* '.take(5)' - geeft als resultaat een nieuwe ring die alleen eerste 5 elementen bevat
* '.drop(3)' - geeft als resultaat een nieuwe ring met alles behalve de eerste 3 elementen
* '.butlast' - geeft als resultaat een nieuwe ring maar ontbreekt het laatste element
* '.drop_last(3)' - geeft als resultaat een nieuwe ring maar de laatste 3 elementen ontbreken
* '.take_last(6)'-geeft als resultaat een nieuwe ring met alleen de laatste 6 elementen
* '.stretch(2)' - herhaald tweemaal elk element in de ring
* '.repeat(3)' - herhaalt de hele ring 3 keer
* '.mirror' - voegt de ring naar een omgekeerde versie van zichzelf toe
* '.reflect' - hetzelfde als spiegel maar middelste waarde wordt niet gedupliceerd
* `.scale(2)`- geeft een nieuwe ring met alle elementen, maal 2 (van uitgegaan dat ring alleen cijfers bevat)

Natuurlijk, kan je in deze chain methoden ook andere cijfers gebruiken! Dus voel je vrij om `.drop(5)` in plaats van `.drop(3)` als je de eerste 5 elementen wilt laten vallen.
