フラットスコープ

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

Comments