前回に引き続いて、今回は2章(配列とハッシュ)についてまとめていきます
前回のリンクはここから okkun-sh.hatenablog.com
配列とは
いくつかのオブジェクトの参照を順に並べたもの
配列が保持している個々のオブジェクト参照のことを配列の要素という
つまりオブジェクトが更新されると、そのオブジェクトを参照している全ての配列要素の値も変化して見える
Array クラスのインスタンスである
また配列同士を比較する場合、対応する要素がすべて同値の場合、同値となる
配列の構築
要素を並べて []
で括る
bar = "bar" array = ["hoge", 1, bar, [2, 3]] p array # ["hoge", 1, "bar", [2, 3]]
添字参照
要素は 0 から始まり、その番号 + []
(添字参照演算子) でオブジェクトにアクセスできる
様々な添字参照
- 負の添字
添字が負の場合には末尾から逆順に要素を指す番号と解釈する
array = [1, 2, 3, 4 ,5] p array[-1] # 5 p array[-3] # 3
- 長さ付き添字
位置と長さの指定をすることもできる
要素の番号 n に対する要素の個数 m で、n 以降 m 個の要素を含む新しいオブジェクトを返す
array = [1, 2, 3, 4 ,5] p array[1, 4] # [2, 3, 4, 5] p array[-3, 4] # [3, 4, 5]
- 範囲添字
添字に範囲オブジェクトを渡すと、添字の番号がその範囲に含まれる要素を取得できる
array = [1, 2, 3, 4, 5] p array[0..1] # [1, 2]
添字代入
添字参照に代入文を組み合わせたような感じに見えるが、添字参照は Array#[]
メソッドが呼び出され、添字代入は Array#[]=
メソッドが呼び出される
array = [1, 2, 3] array[3] = 4 array[-1] = 5 p array # [1, 2, 3, 4]
様々なメソッド
- Array#include?
配列に特定の値が含まれているかどうか調べるメソッド
?
疑問符は真偽値を返す - uniq と uniq!
両者共に重複要素を排除するメソッド!
感嘆符は、破壊的メソッドと呼ばれ、レシーバの内部状態を変更する
array = [1, 2, 3, 1, 2, 3] p array.uniq # [1, 2, 3] p array # [1, 2, 3, 1, 2, 3] p array.uniq! # [1, 2, 3] p array # [1, 2, 3]
※疑問符、感嘆符は、あくまでも慣習のため逆らったコードは書くことができる
- each, each_with_index, map
このようなイテレータを使うことで、様々なループ処理を書くことができる
ハッシュとは
任意のオブジェクトをキーとして別のオブジェクトに対応を付けるコンテナオブジェクトのこと
Hash クラスのインスタンスである
またハッシュ同士を比較する場合、全ての対応する要素ペアについて、互いにキー、値が等しい時に同値となる
ハッシュの構築
波括弧({}
)内にキーと値の対応関係を並べることでハッシュを生成することができる
hash = { "hoge" => "hogehoge", "bar" => "barbar", "foo" => "foofoo", } p hash # {"hoge"=>"hogehoge", "bar"=>"barbar", "foo"=>"foofoo"}
添字参照・代入
hash = { "hoge" => "hogehoge", "bar" => "barbar", "foo" => "foofoo", } p hash["bar"] # "barbar" hash["aaa"] = "aaaaaa" # {"hoge"=>"hogehoge", "bar"=>"barbar", "foo"=>"foofoo", "aaa"=>"aaaaaa"} p hash
様々なメソッド
- each
each メソッドではブロック引数として、キーと値が渡される
順不同である
Enumerable モジュール
each メソッドから導出可能なメソッドを集めたモジュール
Array, Hash は Enumerable というモジュールを継承しており、似たメソッドを多数持っている
モジュールとは
共通のクラスを継承せずに実装を共有できる仕組み
感想
内容は簡単なので全然理解しやすい
アウトプットする為にメモを取ったり、サンプルコードを書きながら読んでいるので時間はかかっているが内容は頭に入ってきていそう
とにかく全てオブジェクトだよってことを凄い意識して書かれてるなと思った
続きはこちら