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

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

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

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

Q&A

解決済

4回答

6479閲覧

Rubyでのプログラムの問題

techtottori

総合スコア26

Ruby

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

0グッド

0クリップ

投稿2016/10/17 02:02

#前提
Ruby
書籍「プログラマ脳を鍛える数学パズル」より問題箇所を抜粋。

プログミング歴がまだ半年と短く、ど素人当然の質問をしてしまいますが、何卒よろしくお願いします。

#発生している問題・エラーメッセージ
Q04.rb:7:in `+': nil can't be coerced into Fixnum (TypeError)

#ソースコード
def cutbar(m, n, current)
if current >= n then

elsif current < m then
1 + cutbar(m, n, current * 2)
else
1 + cutbar(m, n, current + m)
end
end

puts cutbar(3, 20, 1)
puts cutbar(5,100, 1)

#補足
プログラムを書き始めて、日が浅いので、エラーが出るたびに止まってしまいます。

もしよろしければ、回答者の方々がどのようにエラーに対処しているのか教えていただきたいです。

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

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

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

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

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

guest

回答4

0

ありがとうございます

投稿2021/01/26 06:23

kaikubo_ko

総合スコア13

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

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

Zuishin

2021/03/02 05:42

> ありがとうございます 誰に何のお礼を言ったんですか?
guest

0

ベストアンサー

ちょっと冗長に書くと

ruby

1def cutbar(m, n, current) 2 if current >= n then 3 return nil 4 elsif current < m then 5 return 1 + cutbar(m, n, current * 2) 6 else 7 return 1 + cutbar(m, n, current + m) 8 end 9end

と同じ意味になります。

ですので current >= ntrue の時に cutbar の戻り値が nil になります。

すると 1 + cutbar(m, n, current * 2) などの部分が 1 + nil になってしまい

Q04.rb:7:in `+': nil can't be coerced into Fixnum (TypeError)

nil はできない無理矢理変換 Fixnum に

という事でrubyが、がんばって 1nil+ するために nilFixnum に変換しようとするのですが「これはできないや。」と、あきらめてエラー(TypeError)が発生しています。


rubyでのエラーというものは例外の発生に(ほぼ)等しく、どの例外クラスの例外が発生しているかで何となくわかります。

ruby標準の例外クラスは 公式リファレンス例外クラスのところに書いてあります。
今回は TypeError ですね

最初のうちは意味不明かもしれませんが、よく発生する例外はだいたい決っているのでマメに見ていればそのうち見えてくるようになると思います。

投稿2016/10/17 03:38

hana-da

総合スコア1728

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

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

0

このエラーは、nilと数値の足し算はできないために出ています。
cutbarメソッドがnilを返さないようにしましょう。(0にするなど)

エラーの対処の仕方についてですが、自分が知っているようなエラー以外だったら、

Q04.rb:7:in `+': nil can't be coerced into Fixnum (TypeError)

のようなエラーが出た時には、それをそのまま検索してみます。
すると対処法は意外と出てくるものです。
もし無かったらソースコードを読むなどしています。

投稿2016/10/17 03:19

cameluby

総合スコア891

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

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

0

ruby

1if current >= n then 2 3elsif current < m then

このようになっているので、current >= nの場合にこのメソッドがnilを返してしまい、あとで足し算に使えなくなります。

何を返せばいいのかわからないですが、適切な値を返しましょう。

なお、複数行のif文を書く場合、thenは何の意味もありません。書く手間が無駄なだけなので、書かないほうがいいです。

投稿2016/10/17 02:23

maisumakun

総合スコア145183

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問