Project

General

Profile

Actions

Bug #21384

closed

const_added is triggered twice when using autoload

Added by petekinnecom (Pete Kinnecom) 8 days ago. Updated 1 day ago.

Status:
Closed
Assignee:
-
Target version:
-
[ruby-core:<unknown>]

Description

As the title says, I've noticed that const_added is invoked twice when using autoload. I'm wondering if this behavior is intended or perhaps a bug. Here's a small script to reproduce what I'm seeing:

require "tmpdir"

dir = Dir.mktmpdir

File.write(
  File.join(dir, "const.rb"),
  "class Const; end"
)

def Object.const_added(const_name)
  super.tap { puts "const_added: #{const_name}" }
end

$LOAD_PATH << dir

puts "before autoload call"
autoload :Const, "const"
puts "after autoload call"
puts Const

# Produces output:
#
# => before autoload call
# => const_added: Const
# => after autoload call
# => const_added: Const
# => Const

I'm seeing the behavior using the following docker containers ruby:3.2 and ruby:3.5-rc when running like so: docker run -v ./:/home ruby:3.5-rc ruby /home/script.rb. Thanks.

Updated by fxn (Xavier Noria) 7 days ago

It is intended.

Reason is, constants includes the constant after a call to autoload.

Updated by fxn (Xavier Noria) 7 days ago

Let me add that I'd prefer that Ruby does not consider autoloads as constants in the API, I'd like autoloads to become constants if realized (autoloading can err, and even if succeeds, the owner may not be the receiver of the autoload call).

But that is the way it works.

Updated by petekinnecom (Pete Kinnecom) 7 days ago

I see, thank you for the clarification!

Actions #4

Updated by nobu (Nobuyoshi Nakada) 3 days ago

  • Status changed from Open to Closed

Updated by mame (Yusuke Endoh) 1 day ago

Briefly discussed at the dev meeting. @matz (Yukihiro Matsumoto) said that it was not intentional to fire the hook twice. But changing it now would be a compatibility concern, so he decided to keep the current behavior.

Conceptually, we may consider this behavior as:

  • When autoload is set, the constant is (virtually) defined (and const_added fires)
  • When the constant is actually defined by the firing of autoload, the constant is conceptually deleted once and defined again (and const_added fires again)
Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0