Skip to content

Commit

Permalink
Module#class_evalで、定数/クラス変数のスコープについての説明を強化
Browse files Browse the repository at this point in the history
  • Loading branch information
kyanagi committed Nov 4, 2024
1 parent 778f0e2 commit 932e796
Showing 1 changed file with 20 additions and 0 deletions.
20 changes: 20 additions & 0 deletions refm/api/src/_builtin/Module
Original file line number Diff line number Diff line change
Expand Up @@ -987,6 +987,7 @@ C.method_defined? "private_method2" #=> false

ただし、ローカル変数は module_eval/class_eval の外側のスコープと共有します。

定数とクラス変数のスコープは、文字列が与えられた場合とブロックで与えられた場合で挙動が異なります。
文字列が与えられた場合には、定数とクラス変数のスコープは自身のモジュール定義式内と同じスコープになります。
ブロックが与えられた場合には、定数とクラス変数のスコープはブロックの外側のスコープになります。

Expand All @@ -1012,6 +1013,25 @@ C.class_eval %Q{
p C.new.m #=> [:m, 1]
#@end

#@samplecode 定数のスコープが異なる例
class C
end

# ブロックが渡された場合は、ブロックの外側のスコープになる。
# つまり、この場合はトップレベルに定数 X を定義する。
C.class_eval { X = 1 }

# 文字列が渡された場合は、モジュール定義式内と同じスコープになる。つまり、この場合は
# class C
# X = 2
# end
# と書いたのと同じ意味になる。
C.class_eval 'X = 2'

p X #=> 1
p C::X #=> 2
#@end

#@since 1.9.1
@see [[m:BasicObject#instance_eval]], [[m:Module.new]], [[m:Kernel.#eval]]
#@else
Expand Down

0 comments on commit 932e796

Please sign in to comment.