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

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

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

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

Q&A

解決済

3回答

919閲覧

【Ruby入門】思うようにならない

SIByL

総合スコア11

Ruby

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

1グッド

1クリップ

投稿2018/02/15 04:57

前提・実現したいこと

Rubyで
「もっと速く!」
「もっと速く!」
「もっと速く!」
「もっと速く!」
「よーしいいだろう」
と表示したいです。

しかし、わたしが書いたプログラムでは
「もっと速く!」
「もっと速く!」
「もっと速く!」
「もっと速く!」
「もっと速く!」
と表示されてしまいます。

改善点をご指摘おねがいします。(ちなみにボクシングのコーチを想定しています)

発生している問題・エラーメッセージ

エラーメッセージ

該当のソースコード

Ruby

1def teach(count, max) 2 if count < max 3 puts("もっと速く!") 4 else 5 puts("よーしいいだろう") 6 end 7 count += 1 8end 9 105.times do 11teach(count=1, max=5) 12end

試したこと

count -= 1 のバージョンも試しましたがダメでした。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

DrqYuto👍を押しています

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

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

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

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

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

guest

回答3

0

ベストアンサー

teachの中のcountローカル変数なので、メソッドの実行が終われば消滅します。なので、何回実行しても呼ばれたときのcount=1のままです(5.timesの中にあるcountmaxと、teachの中のcountmaxは、同じ名前なだけで別物です)。

Rubyで「1から5まで」のようにしたい場合、uptoが便利です。

ruby

1# teachはそのまま 2 31.upto(5) do |count| 4 teach(count, 5) 5end

投稿2018/02/15 05:02

maisumakun

総合スコア145121

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

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

SIByL

2018/02/16 05:28

回答ありがとうございます。 ご指摘どおり、uptoを使ったらうまく表示されました。勉強になりました。 ところで、uptoについて1つ質問をよろしいですか? 『RubyLife』というサイトでuptoについて調べてみました。そのサイトの説明を見て、上記のプログラムは、|count| に1~5を順に代入しながらteachメソッドを行うと解釈しました。 そこで、teachメソッドの count += 1 は必要ないだろうと思い消してみました、。そしたら起動しなくなりました。 理由がわからないので、教えていただけませんか?
SIByL

2018/02/16 11:01

返信ありがとうございます。 すみません。わたしの誤認でした。endも一緒に消してしまってました。 丁重なご回答をいただき本当に助かりました。ありがとうございました。
guest

0

別回答ですがmethodの中身をシンプルにすると外側を凝るだけで良くなるので、良いですよ

rb

1 2def teach(count, max = 5) 3 count < max ? puts('もっと速く!') : puts('よーしいいだろう') 4end 5 6Array.new(5).each_with_index do |_, idx| 7 teach(idx + 1) 8end 9 10もっと速く! 11もっと速く! 12もっと速く! 13もっと速く! 14よーしいいだろう

投稿2018/02/15 10:38

orange-lion

総合スコア426

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

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

SIByL

2018/02/17 05:28

回答ありがとうございます。 すごく難しいです!rubyの学習が進んだ後で、もう一度確認しようと思います。
guest

0

「こういう書き方もあるんだな」くらいに思っていただければ幸いです

ruby

1def teach(count, max) 2 if count < max 3 puts("もっと速く!") 4 teach(count + 1, max) 5 else 6 puts("よーしいいだろう") 7 return 8 end 9end 10 11teach(1, 5)

再帰処理を書き、自分自身を呼び出すことで、繰り返し処理を記述することができます

投稿2018/02/15 08:11

gouf

総合スコア2321

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

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

SIByL

2018/02/17 05:24

回答ありがとうございます。 すごいですね!メソッドの中に自分自身を記述する手法があるなんて面白いと感じました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問