第五話 ネストメソッド

メソッドは以下のようにネストして書ける。

def foo
  def bar
  end
end

どうしてこれを許しているのか、最近まで判らなかった。
bar()がfoo()の中でしか使用できないようになっているのであれば意味があるが、実際にはそうなっていないのだから。しかし、yarv-dev MLのログを読んでいるうちに理由がわかった。
以下のように書きたいことがあるからだろう。

def foo
  String.module_eval {
    def bar()
      ...
    end
  }
end

ブロックが間に入っているが、これもメソッドがネストしているのは確かだ。しかし、これはネストメソッドであることに特別の意味があるわけではなく、コードを書く側もそれを期待してはいない。そうであれば、ブロックを間に挟まないネストメソッドは禁止して、ブロックを挟む場合には許すが、これはネストメソッドではなく通常のメソッドであると言う仕様で問題ないのではなかろうか。そうすれば、ネストメソッドをメソッド内のローカルメソッドとして機能させるという、面倒な実装をしなくて済むだろう。