🎃

[Bug #21384] autoload の使用時に const_added が2回呼び出されるバグ報告

に公開

[Bug #21384] const_added is triggered twice when using autoload

  • autoload の使用時に const_added が2回呼び出されるバグ報告
# foo.rb
class X::Foo
end
class X
  def self.const_added(m)
    puts "=== const_added: #{m} ==="
  end

  puts "--- autoload ---"
  autoload :Foo, "./foo.rb"
end

puts "--- reference Foo ---"
X::Foo
__END__
output:
--- autoload ---
=== const_added: Foo ===
--- reference Foo ---
=== const_added: Foo ===
  • これなんですが2回実行されるのは意図的ではないが変更すると互換性の問題もあるので現状を維持する、という結論になったようですね
  • 一応、2回実行される理由としては以下のような形になる
    • autoload が設定されたタイミングで仮想的に定数が定義され const_added が実行される
      • これが1回目
    • autoload 等で実際に定数が定義されたときに定数が再定義され const_added が実行される
      • これが2回目
GitHubで編集を提案

Discussion