質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

4回答

1824閲覧

繰り返しについて

pinokio

総合スコア32

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

0クリップ

投稿2015/08/04 11:06

編集2015/08/04 13:24

以下のように、1から100まで数え上げるプログラムが幾つかあるのですが、
どれを使うのが良いのでしょうか?
理由も教えていただけますと幸いです。

個人的にはwhileはプログラムの外に変数を定義しているのと、
複数行になってしまっているので、あまり良くないかなとは思っています。

lang

1i = 0 2while i <= 100 do 3 p i 4 i += 1 5end 6 7100.times do |i| 8 p i 9end 10 11for i in 1..100 do 12 p i 13end 14 151.upto(100) do |i| 16 p i 17end 18 19(1..100).each do |i| 20 p i 21end

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

ベストアンサー

whileの条件が間違えているのはすでに指摘のある通りですが、1から100であれば、

Ruby

1i = 1 2while i<= 100 do 3 p i 4 i += 1 5end

です。また、100.timesだと、iは0から99です。1から100ではありません。
というあたりが、デメリットを示しているのではないでしょうか。

私見を並べると、

  1. whileは回数によるものでない繰り返しに使う
  2. timesはカウンタ(ここではi)を参照しないケースだと良い。カウンタが参照出来るのはオマケ機能と思え
  3. uptoは悪くない
  4. eachが普通
  5. forはeachと同じだが、カウンタのスコープが異なるので注意。無意味にスコープの広い変数を使うのは普通は良くない

投稿2015/08/04 13:01

otn

総合スコア84529

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

どれを使うのが良いのでしょうか?
理由も教えていただけますと幸いです。

今回の例ですと(1..100).eachが一番良いです。

LLmanさんも言うように、whileは基本的にいつ終わるか分からないものに対して多く使われます。

100.timesも固定回数の時によく使われますが、今回は「1から数え上げ」とあるのでeachの方がベターです。

for item in rangeという書き方は最近ではほとんど使われていません。さらに言うとこれは内部的にeachを呼び出しているだけなので、要らない構文です。

1.upto(100)は今回の用途にマッチしているのですが、実際のところ使いどころが少なく、この関数が使えるときは大抵「(1..100)でいいじゃん」となるのであまり使われません。
使われないのでコードを読む人もuptoってなんだっけ?と忘れがちになるので可読性も落ちます。(関数名から推測はつくのですが、こういうのは「あれ?100は含むんだっけ含まないんだっけ?」と思って結局ググることになるので私は避けます)

というわけで今回の「1から数え上げ」という用途であればeachがベストです。
ゼロからだったらtimesがベストですがRange+eachでも悪くはないです。

投稿2015/08/04 12:39

hello-world

総合スコア1342

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

どれを使うのが良いのでしょうか?

べつにどれを使っても文法上は構いませんが、
使い分けをすることはあります。

繰り返す回数が決まっているときはtimesなど、
キーを押すと処理ループを抜けるといったように、
繰り返す回数が決まっていないときにはwhileを使います。


ところで、ご質問からは外れますが、

ruby

1i = 0 2while i > 0 do 3 p i 4 i += 1 5end

質問文のこのコードは何も表示されません。

ruby

1i = 0 2while i < 100 do 3 p i 4 i += 1 5end

ほかのループと同じ意図であれば、
たとえば下のように書きます。
whileの条件部を比較してください。

投稿2015/08/04 11:34

編集2015/08/04 11:45
LLman

総合スコア5592

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

... 1から100まで数え上げる...

質問の意図とは異なりますが、
数の和をもとめるだけならループをさせずにすむ方法もあります。

(1..100).inject(0) {|sum, n| sum + n }

=> 5050

100 * 101 / 2

=> 5050

投稿2015/08/05 22:01

katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問