なんとなく日々徒然と

フラットスコープ

rubyにはスコープゲートがある。
スコープゲートを越えて変数は参照できない。

スコープゲートには

class
module
def

があり、それぞれのブロックの中ではスコープが切り替わる。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
class Foo
  str = "foo"
  
  def print
    str
  end
end

foo = Foo.new
foo.print # => NameError: undefined local variable or method `str'が発生する

def printでスコープが変わるので、外側のstrが参照できない。

解決するには例えばフラットスコープ

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
class Bar
  str = "bar"
  
  define_method :print do
    str
  end
end

bar = Bar.new
bar.print

スコープゲート(class/module/def)を使わなければいいという話。
今回はdefをdefine _methodに変更した

classはClass.new
moduleはModule.new

でブロック内部に中身を記述する。
一応クラスの場合の例。

1
2
3
4
5
6
7
8
str = "bar"
Bar = Class.new do
  define_method :print do
    str
  end
end

Bar.new.print

Tags:

動的ディスパッチと動的メソッド テーブルの一覧を取得

comments powered by Disqus