個人メモです。
eachメソッドを使用すると、配列やオブジェクトなどの要素を一つづつ抜き出して、その値を使った処理を行うことができる。
##目次
- eachメソッドとfor文の違い
- eachメソッドの構文
- 対象がrangeオブジェクトの場合
- 対象が配列の場合
-
対象がハッシュの場合
6. 引数が1つの場合
7. 引数が2つの場合 -
each_pair, each_key, each_valueメソッド
9. each_pairメソッド
10. each_keyメソッド
11. each_valueメソッド
##eachメソッドとfor文の違い 処理の内容はfor文と同じ。for文との違いは**変数のスコープ**。
**▼スコープの違い** **変数が処理の中のみ有効か、外でも有効かの違い**となる。
- for文: 外でも有効
- eachメソッド: 中のみ有効。外では無効。
綺麗に処理を書きたければeachメソッドがベター。デメリットは変数を外と切り分けるため、処理量は若干大きくなる。(ほぼ気にする必要はない)
**▼対象がrangeオブジェクトの場合** オブジェクトにrangeオブジェクト`..`や`...`を指定する場合は、eachはカッコで囲む必要がある(後述)。
##eachメソッドの構文
・オブジェクト.each {|変数| 処理}
┗ オブジェクトはイテラブル
┗ 変数には取り出した一つ一つの値が入る
┗ { }
をブロックという
ブロック{}
は do |変数| 処理 end
と同じ。
非破壊なので元のオブジェクトは変わらない。
また、他の変数に代入しても、元のオブジェクトと同じものになる。
range1 = 1..3
range2 = (1..3).each{|x| y = x*2; p y }
#2
#4
#6
p range1 #1..3
p range2 #1..3
##対象がrangeオブジェクトの場合 対象がrangeオブジェクトの場合はカッコで囲む。
(1..3).each{|x| p x}
##出力
1
2
3
rangeオブジェクトはドットが2つの場合は終わりの値を含む。3つの場合は含まない。
**▼エラー** カッコで囲まないとエラーになる。
1..3.each{|x| p x}
NoMethodError (undefined method `each' for 3:Integer)
**▼変数に代入** rangeオブジェクトを代入した変数ならそのまま指定できる。
range1 = 1..3
range1.each{|x| p x}
##出力
1
2
3
**▼for文の場合** for文の場合はカッコを付けなくても機能する。
for x in 1..3
p x
end
##出力
1
2
3
##対象が配列の場合
arr = [1, 2, 3]
arr.each{|x| p x}
##出力
1
2
3
もちろん、処理後もarrは元のまま。
##対象がハッシュの場合 ハッシュの場合は指定する変数の数により取得できる要素が異なる。
変数の数 | 内容 | 取得要素の例 |
---|---|---|
1 | キーと値 | [:a, 1] |
2 | 第1引数:キー、 第2引数:値、 | :a, 1 |
###引数が1つの場合 引数が1つの場合は、キーと値がセットになった配列を一つづつ取得する。
引数が1つの場合
obj = {:a=>1, :b=>2, :c=>3}
obj.each{|x| p x}
##出力
[:a, 1]
[:b, 2]
[:c, 3]
###引数が2つの場合 引数が2つの場合は、第1引数がキー、第2引数が値となる。
▼キーのみ出力
obj = {:a=>1, :b=>2, :c=>3}
obj.each{|x, y| p x}
#出力
:a
:b
:c
▼値のみ出力
obj = {:a=>1, :b=>2, :c=>3}
obj.each{|x, y| p y}
#出力
1
2
3
##each_pair, each_key, each_valueメソッド ハッシュのキーと値を取得する方法には、eachメソッドの変数で指定する意外に、各メソッドが用意されている。
###(1) each_pairメソッド
eachのブロックで変数を1つ指定したものと同じ。キーと値をセットの配列として取り出す。
引数が1つの場合
obj = {:a=>1, :b=>2, :c=>3}
obj.each_pair{|x| p x}
##出力
[:a, 1]
[:b, 2]
[:c, 3]
###(2) each_keyメソッド
keyのみ取り出すメソッド
obj = {:a=>1, :b=>2, :c=>3}
obj.each_key{|x| p x}
#出力
:a
:b
:c
###(3) each_valueメソッド
値のみ取り出すメソッド
obj = {:a=>1, :b=>2, :c=>3}
obj.each_value{|x| p x}
#出力
1
2
3
eachメソッドの変数の数や指定方法で出しわければいいので、特にeach_xxxメソッドは使う必要がなさそう。