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

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

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

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

Q&A

解決済

3回答

319閲覧

Rubyのloop構文を使って0から10までを表示し6をとばして表示する処理は可能かどうか

upzura

総合スコア13

Ruby

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

0グッド

0クリップ

投稿2019/02/20 02:48

本日初めて質問させていただきます。
プログラミング初心者で、現在はじめてのプログラミング言語としてRubyに取り組んでおり、まずはドットインストールで学習中です。
こちらのドットインストールのRubyの繰り返し処理の中でloopやnext、breakなどが出ており、動画とは別に処理を色々と試していました。

そこで0から10までを表示し6をとばして表示する処理をloop構文で表せないかと思いましたがうまくできず、こちらで質問させていただきました。
コマンドは、irb形式で行っています

当初は、loopを使って以下のコードで試して見ました。

number = 0 loop do puts number number += 1 if number == 6 next elsif number == 10 break end end

結果は、breakのみが実行されて6をとばすは実行されませんでした。

次に、以下に変更しました。

loop do next if number == 6 puts number number += 1 break if number == 10 end

結果は↓の画像のように0から5までが表示され、2.4.1 :001 >のような画面(プロンプト?)が消えてしまいました。
https://gyazo.com/9a739c498f248c14e90d7313c1707613

上記のコードをtimesメソッドで試した場合は、望んだ表示になりました。

10.times do |number| next if number == 6 puts number number += 1 end

まとめですが、質問点は二つ
・0から10までを表示し6をとばして表示する処理はloop構文では表現できないか
・二個目のコードを入力した際、何故irb形式で現れる2.4.1 :001 >が消えてしまったのか
です。

質問でわかりにくいところ、質問で足りていない点などございましたら、ご指摘お願い致します。

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

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

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

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

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

guest

回答3

0

二個目のコードを入力した際、何故irb形式で現れる2.4.1 :001 >が消えてしまったのか

number == 6となったときにnumber += 1の処理も飛ばしてしまうので、永遠に6から動かなくなる無限ループになってしまいます。

0から10までを表示し6をとばして表示する処理はloop構文では表現できないか

できますが、ちょっと工夫が必要です。

ruby

1number = 0 2loop do 3 unless number == 6 4 puts number 5 end 6 number += 1 7 break if number > 10 8end

paiza.ioで実行した結果


余談ですが、こんな書き方もできます。

ruby

1(0..10).reject { |i| i== 6 }.each{ |i| puts i }

投稿2019/02/20 02:57

maisumakun

総合スコア145121

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

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

upzura

2019/02/20 08:40

rejectメソッドのブロックを利用しても同様の事ができるのですね。確かめてみてなるほどと納得しました。回答ありがとうございます。
guest

0

ベストアンサー

・0から10までを表示し6をとばして表示する処理はloop構文では表現できないか

できます。
表示のタイミング、numberの更新のタイミング、処理をスキップするタイミングがどうなっているのか、
順番に1行ずつ確認しながら追っていけば分かるかと思います。

timesとの大きな違いはnumberの更新タイミングです。

・二個目のコードを入力した際、何故irb形式で現れる2.4.1 :001 >が消えてしまったのか

消えたわけではないです。
numberが6のとき、next if number == 6で後の処理をスキップしてループの先頭に行きます。
numberが6のままnext if number == 6に来て同じになります。
...
の連続で処理がいつまで経っても終わらないだけです。

投稿2019/02/20 02:56

dice142

総合スコア5158

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

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

upzura

2019/02/20 08:37

質問について、どうやらnumberの挙動について理解が問題解決の鍵だったようです。的確なポイントを教えていただきありがとうございます。
guest

0

ruby

1loop do 2 next if number == 6 3 puts number 4 number += 1 5 break if number == 10 6end

ですと、number == 6の場合

ruby

1loop do 2 next 3end

と同じ挙動をします。
理由としてはnumber += 1に到達する前にnextでloop先頭に戻ってしまうからですね。

10.times doの記法の場合は、nextすると次に進むため問題ないように見えます。


loopで実装する場合、私の書き方だと冗長になりますがこんな感じです。

ruby

1number = 0 2loop do 3 if number == 6 4 number += 1 5 next 6 end 7 puts number 8 number += 1 9 break if number == 10 10end

投稿2019/02/20 02:53

編集2019/02/20 03:10
toushimi

総合スコア117

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問