間違いの修正

プログラムが間違いなく一発で動くことはまれである。必ずどこか間違える ものなのでそれを修正しなければならない。ここでは一つの間違いプログラム を修正していく手順を詳しく示す。この節は最初は読み飛ばし、練習問題を 解くときに実際にたくさんの間違いに遭遇してから戻って読んでも構わない。

ためしに以下のプログラムを~/Ruby/mistake.rbという名前で保 存しよう。「間違い」を修正するためにわざと間違えているプログラムなので 一字一句正確に入力しよう。念のため、誤っている部分には 下線が施してある。

mistake.rb

#!/usr/koeki/bin/luby
# -*- coding: utf-8 -*-

put "整数を入れてください"
n=gets.to_i
if m%2 == 0 then
  print "偶数です\n
else
  print "奇数です\n"

保存したらTerminalで実行属性を付けておく。

chmod +x mistake.rb

典型的な間違いの例とその修正方法を示していく。

  1. 「インタプリタ指定の間違い」

    まずは実行してみよう。

    ./mistake.rb
    zsh: ./mistake.rb: bad interpreter: /usr/koeki/bin/luby: no such file or directory
    ls -lF mistake.rb
    -rwxr-xr-x  1 yuuji  wwwadmin  123 Jul 27 22:23 mistake.rb*
    

    ファイルが実際にあるのに「./mistake.rb なんてファイルはない」というエラーが出ている。 プログラム1行目のインタプリタの指定が間違っている。 1行目を以下のように修正して保存しよう。

    #!/usr/koeki/bin/luby
    

    #!/usr/koeki/bin/ruby
    # -*- coding: utf-8 -*-
    
  2. 「引用符の閉じ忘れ」

    1行目の修正と保存が終わったら再度実行してみよう。 直したのにエラーが増える。

    ./mistake.rb
    ./mistake.rb:8: syntax error, unexpected local variable or method, expecting `end'
      print "奇数です\n"
    ./mistake.rb:8: unterminated string meets end of file
      print "奇数です\n"
    ./mistake.rb:8: syntax error, unexpected end-of-input, expecting `end'
      print "奇数です\n"

    たくさんのエラーが出て、なおかつ最後の方に

    unterminated string

    というメッセージがある場合は "" または '' を閉じていない場合である。このようなときは、たいてい最初に出てくる エラーメッセージに着目すればよい。今回は

    mistake.rb:8: unterminated string meets end of file

    とあるので、引用符の閉じ忘れを探す。今回の場合は 8行目を修正する。

    print "偶数です\n
    

    print "偶数です\n"
    

    エラーメッセージのファイル名の後ろに「:8:」とあるのは 「プログラムの8行目に間違いがあるよ」という意味である。 Rubyインタプリタは必ず間違いのある場所を行番号表示するので 必ずこれを確認する。Emacsで指定した行番号の位置に移動するには 編集バッファの下の方に

    -かんな-EJE:---F1  mistake.rb     All L3   ...

    のような反転表示行の「L3」のような数字を参考にする。 あるいは、

    M-x goto-line [Return]
    8 [Return]

    とすると8行目に直接移動できる。

  3. endの閉じ忘れ」

    修正して保存したらまたプログラムを実行してみよう。

    ./mistake.rb
    mistake.rb:8: syntax error, unexpected end-of-input, expecting `end'
      print "奇数です\n"

    「expecting `end'」と表示された。 expecting は「期待している」ということで、end があるはずなのに、 ないと言われている。指定通り、プログラムの末尾に

    end
    

    と書いた行を追加して保存しよう。

  4. 「単語の打ち間違い」

    修正したらまた実行しよう。

    ./mistake.rb
    ./mistake.rb:3:in `<main>': undefined method `put' for main:Object (NoMethodError)
    Did you mean?  puts
                   putc
    

    「undefined」とは「未定義の」という意味だが、Rubyプログラムの 場合綴り違いをおかしている時に発生するエラーである。 エラーメッセージのとおり3行目に間違いがある。"Did you mean?" は もしかして……では? ということで、その次にある puts か putc の書き間違いではないかと指摘してくれている。この場合、 putではなくputsが正しい。

    put "整数を入れてください"
    

    puts "整数を入れてください"
    

    修正後もう一度実行するとまたエラーが起こる。

    ./mistake.rb
    整数を入れてください
    8
    ./mistake.rb:5:in `<main>': undefined local variable or method `m' for main:Object (NameError)
    
    if m%2 == 0 then
       ^
    

    これも「undefined」なので綴り間違いである。5行目の mの下に ^ 記号は間違っている場所の 指摘である。上で利用している変数nに直す。

    if m%2 == 0 then
    

    if n%2 == 0 then
    

現段階では、Rubyの文法自体を理解する前なのでエラーメッセージの 意味も理解しがたいが、必ずエラーのある行番号が 表示されることを覚えておくとすばやく対処できる。


本日の目次