[Bug #20411] Kernel.autoload? の挙動に関する確認

2024/04/07に公開

[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"
  • という事でこの挙動自体は仕様になります
GitHubで編集を提案

Discussion