⛳
[Bug #20411] Kernel.autoload? の挙動に関する確認
[Bug #20411] Kenrel.autoload? behaviour
-
Kenrel.autoload?
の挙動に関するチケット - 以下のように
Module.autoload?
では期待する値が返ってくるがモジュール内でKernel.autoload?
を呼び出した場合は返ってこない
autoload :A, "a.rb"
module B
# こっちでは Kernel.autoload? が nil を返す
pp Kernel.autoload?(:A) # => nil
pp Module.autoload?(:A) # => "a.rb"
end
# ここでは両方共 `"a.rb"` を返す
pp Kernel.autoload?(:A) # => "a.rb"
pp Module.autoload?(:A) # => "a.rb"
- これは
Module.autoload?
とKernel.autoload?
で対象のスコープが違っているからになります -
Kernel.autoload?
の方は『現在のスコープの名前空間で検索する』のでこのような挙動になっています
autoload :A, "a.rb"
module B
pp Kernel.autoload?(:A) # => nil
pp Module.autoload?(:A) # => "a.rb"
# これは Kernel.autoload? と同等
pp autoload?(:A) # => nil
# B の名前空間に対して判定する
pp B.autoload?(:A) # => nil
puts
autoload :X, "x.rb"
# B 内で定義されている場合はこういう判定になる
pp Kernel.autoload?(:X) # => "x.rb"
pp Module.autoload?(:X) # => nil
pp autoload?(:X) # => "x.rb"
pp B.autoload?(:X) # => "x.rb"
puts
end
pp Kernel.autoload?(:A) # => "a.rb"
pp Module.autoload?(:A) # => "a.rb"
pp autoload?(:A) # => "a.rb"
pp B.autoload?(:A) # => nil
puts
pp Kernel.autoload?(:X) # => nil
pp Module.autoload?(:X) # => nil
pp autoload?(:X) # => nil
pp B.autoload?(:X) # => "x.rb"
- という事でこの挙動自体は仕様になります
Discussion