8.5 リングのチェイン

# リングのチェイン

`range`や`spread`のようなコンストラクタ（作成関数）に加えて、別なリングの作成方法としては、作成したリングを操作する方法があります。


## チェインコマンド

次のような単純なリングを作成します。

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

リングを逆にしたいときにはどうしたらよいでしょう？ リングを反転させるには、チェインコマンドの`.reverse`を使います。

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

では次に、リングから最初の3つの値を取得するにはどうしたらよいでしょう？

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

最後に、リングをシャッフルするにはどうしたらよいでしょう？

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

## 多重チェイン

ここまでで既にリングを作成する強力な方法を見てきましたが、これらのチェインコマンドを一緒に用いることで*本当の*力を発揮します。

リングをシャッフルし、最初の要素を削除し、それに続く3つの要素を得る場合にはどうすればよいでしょう？

段階的に見ていきましょう。

1. `(ring 10, 20, 30, 40, 50)` - リングの最初の状態
2. `(ring 10, 20, 30, 40, 50).shuffle` - シャッフルし - `(ring 40, 30, 10, 50, 20)`
3. `(ring 10, 20, 30, 40, 50).shuffle.drop(1)` - 最初の要素を削除し - `(ring 30, 10, 50, 20)`
4. `(ring 10, 20, 30, 40, 50).shuffle.drop(1).take(3)` - 3つの要素を得る - `(ring 30, 10, 50)`

*コマンドを一緒にくっつける*だけで、これらのコマンドの長いチェインを作れることが分かったと思います。チェインコマンドは好きな順序で組み合わせることができます。またそれにより、既に存在するリングから新しいリングを生成する、とても豊かで強力な方法を作り出すことができます。

## 不変性

リングは強力で重要な特徴を持っています。それは不変性と言って、リングを変更できないということを意味しています。このセクションで紹介しているチェインコマンドが、*リングを変更するのではなく*、*新しいリングを作成*していることを意味しています。これにより、スレッドを跨いでリングを共有して、同じリングを使っている他のスレッドに影響を与えないで、チェインを開始できることを意味しています。

## 利用可能なチェインコマンド

ここに利用可能なチェインコマンドを記載しておきます。

* `.reverse` - 逆順のリングを返却します
* `.sort` - ソートされたリングを作成します
* `.shuffle` - シャッフルされたリングを作成します
* `.pick(3)` - `.choose`を3回呼び出した結果のリングを返却します
* `.pick(3)` - `.choose`を3回呼び出した結果のリングを返却します
* `.take(5)` - 最初の5つの要素をのみからなる新しいリングを返却します
* `.drop(3)` - 最初の3つの要素以外の要素からなる新しいリングを返却します
* `.butlast` - 最後の要素が欠けた新しいリングを返却します
* `.drop_last(3)` - 最後の3つの要素が欠けた新しいリングを返却します
* `.take_last(6)`- 最後の6つの要素をのみからなる新しいリングを返却します
* `.stretch(2)` - リングの個々の要素を2回ずつ繰り返します
* `.repeat(3)` - リング全体を3回繰り返します
* `.mirror` - 逆順のリングを自分自身に追加します
* `.reflect` - mirrorと同様ですが、真ん中の要素を重複させないようにします
* `.scale(2)` - returns a new ring with all elements multiplied by 2 (assumes ring contains numbers only)

数字を引数に取っているチェインコマンドは、他の数字を取ることももちろん可能です。最初の5個の要素を削除したい場合には、`.drop(3)`の代わりに、気軽に`.drop(5)`を呼んでください。
