Rubyではメソッドの中で定数を変更できないのはflymakeもお見通し

Rubyではメソッドの中で定数を変更できない(リフレクション系のメソッドを使わない限り、という意味で)。これは動的にエラーや例外となっているのではなくて、パーズした段階で吐き出されるエラーのようだ。

MyConst = 2

def change_const
  MyConst = 3
end

change_const
$ ruby constchange.rb
constchange.rb:4: dynamic constant assignment
  MyConst = 3
           ^

で、よく見ると、オレのEmacsのflymakeはちゃんと赤のアンダーラインを出してエラーを認識してた。

flymakeは裏で ruby -c を実行して文法をチェックしている。以下と同様。-cを付けるとRubyは実行をせずに文法エラーがないかだけをチェックする。

$ ruby -c constchange.rb 
constchange.rb:4: dynamic constant assignment
  MyConst = 3
           ^

シンタックスだけで判定できるエラーだから当たり前か。

以下のようにするとシンタックスはオッケーでも実行するとビミョウに怒られる。このことからも、最初の例で単に定数を変更しようとしたから怒られたわけではなくて、Rubyでは文法としてメソッド内での定数の変更を許していないことが分かる。

MyConst = 1
MyConst = 2

def change_const
  MyConst == 3
end

change_const
$ ruby -c constchange.rb 
Syntax OK

$ ruby constchange.rb 
constchange.rb:2: warning: already initialized constant MyConst