2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

no implicit conversion of nil into Stringで思わぬところに原因があった話

Last updated at Posted at 2018-10-09

binding.pryを理解して使わないと、binding.pry自体がエラーを起こすよ、という話です。

私はデバッグ時、"binding.pry"を使い倒していました。
そんな時、下記のコードをデバッグすることになりました。

article_blocks.each do |article_block|
      result << if article_block.sentence?
                  sentence = article_block.blockable
                  sentence.body = "test"
                  binding.pry
                elsif article_block.medium?
                                ・
                                ・
                                ・
    end

条件に照らし合わせて処理を行い、処理結果を変数"result"に格納していくというコードです。
しかし、このコード部分で以下のようなエラーが帰ってきました。

TypeError - no implicit conversion of nil into String:

resultに入る値である「sentence.body」には既に"test"という文字列(仮にtestにしています)が入っているため、nilを格納しようとしているわけではありません。なのに何故…(・・?)

結論として、原因は下記の通りでした。

binding.pry自体が返り値としてresultに格納されようとしていたため


そもそもrubyでは、if文のブロックの最終行が返り値として返されます。(returnとかをブロック途中で使った場合はその限りではない)
しかし上記コードでは、binding.pry」自体にはなんの値もセットしていません。(binding.pry自体はnilとなっています)
結果、if文の最終行にあった「binding.pry」が返り値として見られてしまい、resultにnilを格納しようとしたためエラーがでた次第です。


if文の文法ルール、binding.pryが何者かをきちんと理解していればこんなコードは書いていないので、自戒の念も込めて、備忘録として残しました。

まあ私以外にこんな基本的なミスをする人はいないかと思いますが、それでも誰かの役に立てれば幸いです。
(☝︎ ՞ਊ ՞)☝︎

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?