LoginSignup
4
0

More than 3 years have passed since last update.

【Ruby】eachメソッドとfor文の違い。要素を一つづつ取り出し処理を行う。

Last updated at Posted at 2020-12-16

個人メモです。

eachメソッドを使用すると、配列やオブジェクトなどの要素を一つづつ抜き出して、その値を使った処理を行うことができる。

目次

  1. eachメソッドとfor文の違い
  2. eachメソッドの構文
  3. 対象がrangeオブジェクトの場合
  4. 対象が配列の場合
  5. 対象がハッシュの場合
    1. 引数が1つの場合
    2. 引数が2つの場合
  6. each_pair, each_key, each_valueメソッド
    1. each_pairメソッド
    2. each_keyメソッド
    3. 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メソッドは使う必要がなさそう。

4
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0