PHPからRailsに移行した人が戸惑うRubyの繰り返し処理の書き方
Rubyにはいろいろな繰り返し処理の書き方があって、PHPや他の言語から入った人は少し戸惑うんじゃないでしょうか(自分がそうでした)
そんな方のためにRubyの繰り返し処理の書き方をまとめてみました
やること
配列に入ってる1から5の数字を順番に出力する機能を例に見てみましょう
list = [1, 2, 3, 4, 5]
1
2
3
4
5
以下のコードはいずれも同じ1から5の番号を順番に出力するメソッドです
繰り返し処理の書き方
PHP
まずは比較のために、PHPで配列を出力する書き方をみてみましょう
PHPで配列の値を一つずつ取り出す場合に、最もよく使うのはforeachでしょう
$list = [1, 2, 3, 4, 5];
foreach( $list as $no ){
echo $no;
}
1
2
3
4
5
Ruby
for
RubyではPHPのforeachはありません
似た関数のforで書くとこのようになります
(が、Rubyではforは推奨されてないので、実際の現場ではこのようなコードは書きません)
list = [1, 2, 3, 4, 5]
for no in list
p no
end
1
2
3
4
5
each
rubyでは、多くのケースでeachを使います
list = [1, 2, 3, 4, 5]
list.each do |no|
p no
end
1
2
3
4
5
do 〜 endの部分を波括弧{}で置き換えることもできます
list = [1, 2, 3, 4, 5]
list.each { |no|
p no
}
1
2
3
4
5
実際の現場では、1行で済むようなケースはこんな感じに改行しないことが多いです
list = [1, 2, 3, 4, 5]
list.each { |no| p no }
1
2
3
4
5
map
そしてPHPerにはあまり馴染みがないのがMapです
Mapはブロック内で評価した値(結果)を配列として返却してくれます
list = [1, 2, 3, 4, 5]
result = list.map do |no|
p no
end
p result
1
2
3
4
5
[1, 2, 3, 4, 5]
(このような例ではあまりmapを使う意味がありませんが、ブロック内で数値を加算したりする場合に便利なメソッドです)
eachとmapの違い
実はeachもmapも配列を返却してくれますが、それぞれの値は少し異なります
each
list = [1, 2, 3, 4, 5]
result = list.each do |no|
p no+1
end
p result
2
3
4
5
6
[1, 2, 3, 4, 5]
上記は、ブロック内で配列の値それぞれに+1を行った結果と、eachから返却された配列を出力したものです
eachブロック内では+1された値が出力されてるのに対して、配列の返却値resultでは値が初期値から変化しません
([1,2,3,4,5]のまま)
map
list = [1, 2, 3, 4, 5]
result = list.map do |no|
p no+1
end
p result
2
3
4
5
6
[2, 3, 4, 5, 6]
今度はeachをmapに置き換えただけの処理です
返却値resultがブロック内でそれぞれ+1された値になっています
このようにeachの返却値は元々の配列の値なのに対して、mapはブロック内で評価された配列になる、という違いがあります
ディスカッション
コメント一覧
まだ、コメントがありません
新たにPostされたDocs
: ツール関連
キーボードを銀軸から赤軸に買い替えた話
約3年半前、仕事で使うキーボードとしてARCHISS ProgresTouchの ...: スマホ
楽天モバイルがおすすめできない人の特徴とは?
楽天モバイルの最強プランをおすすめできない人の特徴を簡単にまとめてみました また ...: システム開発
なぜスクラムがつらいのか?開発現場が疲弊するのか?スクラムに対する違和感と共に原因を考えてみた
今ではどこの開発現場に行っても、やれスクラムスクラムと、まるでスクラムでもやって ...: Laravel
1つのテーブルを複数のテーブルと結合したい【Laravel10】
1つのテーブルを2つの異なるテーブルに対して結合したいケースがあったのでLara ...: Laravel
Laravelで複数画像アップロード時のvalidateを指定【Laravel10】
jQuery - Image Uploaderを使って、フォームから複数の画像を ...HashMap
created_by
はやぴ
Web/アプリ開発エンジニア
Sierにてお堅いB向けのソフトウェア開発を経て、現在はC向けのWebやアプリを中心に開発しています。
Utilities