間違いの修正

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

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

mistake.rb

#!/usr/koeki/bin/luby

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

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

% chmod +x mistake.rb

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

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

    まずは実行してみよう。

    % ./mistake.rb
    zsh: no such file or directory: ./mistake.rb
    % 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
    
  2. 「引用符の閉じ忘れ」

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

    % ./mistake.rb
    mistake.rb:8: Invalid char `\264' in expression
    mistake.rb:8: Invalid char `\361' in expression
    mistake.rb:8: Invalid char `\277' in expression
    mistake.rb:8: Invalid char `\364' in expression
    mistake.rb:8: Invalid char `\244' in expression
    mistake.rb:8: Invalid char `\307' in expression
    mistake.rb:8: Invalid char `\244' in expression
    mistake.rb:8: Invalid char `\271' in expression
    mistake.rb:8: syntax error
      print "奇数です\n"
                      ^
    mistake.rb:8: unterminated string meets end of file
    mistake.rb:8: syntax error
    

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

    unterminated string

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

    mistake.rb:8: Invalid char `\264' in expression

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

    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

    プログラムが8行で終わっているのに「syntax error」とだけ 表示された。プログラムの末尾で syntax error が出る場合はend を閉じ忘れていることが多い。プログラムの末尾に

    end
    

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

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

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

    % ./mistake.rb
    mistake.rb:3: undefined method `put' for main:Object (NoMethodError)
    

    「undefined」とは「未定義の」という意味だが、Rubyプログラムの 場合綴り違いをおかしている時に発生するエラーである。 エラーメッセージのとおり3行目に間違いがある。 putではなくputsが正しい。

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

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

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

    % ./mistake.rb
    整数を入れてください
    8
    mistake.rb:5: undefined local variable or method `m' ....
    

    これも「undefined」なので綴り間違いである。5行目の mは、nとすべきである。

    if m%2 == 0 then
    

    if n%2 == 0 then
    

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


本日の目次