4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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. 対象がハッシュの場合
    6. 引数が1つの場合
    7. 引数が2つの場合
  6. 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メソッドは使う必要がなさそう。
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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?