ボクココ

個人開発に関するテックブログ

スコープとクラスメソッドの疑問

メタプログラミングRubyでフラットスコープについて学んだ。
でもこれから一つの疑問が生じた。


1 my_var = 1 2 puts "myvar:#{my_var} was called at the top level" 3
4 MyClass = Class.new do
5 my_var += 1
6 puts "myvar:#{my_var} was called at the class"
7
8 define_method :my_method do
9 my_var += 1
10 puts "myvar:#{my_var} was called at the method"
11 end
12 end
13
14 my = MyClass.new
15 my.my_method
16
17 puts "------------"
18
19 @@my_var = 1
20 puts "myvar:#{@@my_var} was called at the top level"
21 class MyClass2
22 @@my_var += 1
23 puts "myvar:#{@@my_var} was called at the class"
24
25 def my_method
26 @@my_var += 1
27 puts "myvar:#{@@my_var} was called at the method"
28 end
29
30 end
31
32 my2 = MyClass2.new
33 my2.my_method
この二つのコードは同じ出力をする。

1 myvar:1 was called at the top level
2 myvar:2 was called at the class
3 myvar:3 was called at the method
4 ------------
5 myvar:1 was called at the top level
6 myvar:2 was called at the class
7 myvar:3 was called at the method

違いはなんだろうなぁ。


後記

define_methodした方は、その方法で定義したメソッドないだけでスコープを共有することができる。
クラスメソッドは全てのメソッドで共有してしまう。
このリスクの差のようです。