memorandums

日々のメモです。

rubyのコード中に全角空白が入った場合の挙動について

rubyの演習課題がわからないと、とある学生から質問があり対応。

エラーがなかなかわからない。。。私自身、rubyでの指導経験がないため(自分で起こしたことがないような)エラーメッセージへの対応はまだまだ不足しています。

エラーの原因は全角空白でした。

実験まで以下のプログラムに1行ずつ全角空白をいれてエラーメッセージをみてみましょう。見やすさのため全角空白の場所に★を記します。


#
while true
  a = gets.chomp
  case a
  when "1"
    break
  end
end

入力前に以下のエラーが発生する。
a.rb:1:in `

': undefined local variable or method ` ' for main:Object (NameError)


#while true
  a = gets.chomp
  case a
  when "1"
    break
  end
end

入力前に以下のエラーが発生する。
a.rb:8: syntax error, unexpected keyword_end, expecting end-of-input


#
while true
★  a = gets.chomp
  case a
  when "1"
    break
  end
end

入力したあとに以下のエラーが発生する。
a.rb:3:in `

': undefined method ` ' for main:Object (NoMethodError)


#
while true
  a = gets.chomp
★  case a
  when "1"
    break
  end
end

1を入力したときには正常終了する!? 1以外の入力のときに以下のエラーが発生する
a.rb:4:in `

': undefined method ` ' for main:Object (NoMethodError)


#
while true
  a = gets.chomp
  case a
★  when "1"
    break
  end
end

入力前に以下のエラーが発生する。これはかなりわかりやすい!
a.rb:5: syntax error, unexpected tIDENTIFIER, expecting keyword_when
  when "1"
^
a.rb:8: syntax error, unexpected keyword_end, expecting end-of-input


#
while true
  a = gets.chomp
  case a
  when "1"break
  end
end

入力前に以下のエラーが発生する。エラーが直感的にわかりにくい。。。
a.rb:6: void value expression


#
while true
  a = gets.chomp
  case a
  when "1"
    breakend
end

1でも1以外の入力に対しても正常に動作する。エラーはでない!?


#
while true
  a = gets.chomp
  case a
  when "1"
    break
  endend

入力前に以下のエラーが発生する。
a.rb:8: syntax error, unexpected end-of-input, expecting keyword_end




バリエーションが結構ありますね。。。たかが全角空白なんですが。JavaではEclipseなどが全角表示を教えてくれるのでこの問題の対応は楽でした。

ruby会議か何かの動画で東大でRubyを教えている方が講演されているのを見たことがありますが、確かdo〜endの対応を見つけるのがシンドイと言われていたと思います。確かにやってみるとシンドイ。。。今、使っているcloud9のエディタ(Ace)がRubyの整形に対応していないためシンドイ。

オンライン講座とかではどーしているのかなぁ?

対処方法を考えないと。。。