メソッド内のメソッド定義(Ruby)

Rubyメソッド内にネストしてメソッドを定義することはできるが、名前空間にならないみたい。クラス内のクラスとはちがう(参照)。あんまり意味がないのかな。

def a
  def b
    puts "B"
  end
  
  puts "A"
  b
end

a
b

の出力は

A
B
B

となる。内側のメソッドb に、トップレベルからアクセスできてしまっている。

メソッドメソッドに意味があるとすれば、メソッドを含むところのメソッドが呼び出されない限り、メソッドメソッドが定義されないこと。例えば

def a
  def b
    puts "B"
  end
end

b

はエラーになり、

def a
  def b
    puts "B"
  end
end

a
b   #=>B

はエラーにならない。

参考:
Ruby のネストしたメソッドと、変数のスコープ | すぐに忘れる脳みそのためのメモ


モジュールを使う

メソッド名前空間を使いたかったら、クラスの他に、モジュールを使う方法がある。これはクラスでのようにインスタンス化しなくてもよい。

module A
  def op
    puts "A"
  end
  module_function :op
end

def op
  puts "B"
end

A::op    #A.opでもよい
op

の出力は

A
B