From: "jeremyevans0 (Jeremy Evans) via ruby-core" Date: 2023-06-21T15:44:33+00:00 Subject: [ruby-core:113973] [Ruby master Bug#19726] Script loadde twice when requiring self Issue #19726 has been updated by jeremyevans0 (Jeremy Evans). Making this change would not be backwards compatible: ```ruby # a.rb if __FILE__ == $0 # $LOADED_FEATURES << File.expand_path(__FILE__) # would break things require './b' else def a 1 end end # b.rb require './a' p a ``` The main script is treated specially compared to required files, in ways beyond this. I'm not sure that it is worth changing this and introducing backwards compatibility issues. Especially since this would still be a circular require, which Ruby issues a warning for in verbose warning mode. ---------------------------------------- Bug #19726: Script loadde twice when requiring self https://bugs.ruby-lang.org/issues/19726#change-103630 * Author: johannes (Johannes Krude) * Status: Open * Priority: Normal * ruby -v: ruby 3.3.0preview1 (2023-05-12 master a1b01e7701) [x86_64-linux] * Backport: 3.0: UNKNOWN, 3.1: UNKNOWN, 3.2: UNKNOWN ---------------------------------------- The executed program is not added to `$LOADED_FEATURES` unexpectedly resulting in the program possibly being loaded twice: a.rb: ``` #!/usr/bin/env ruby require "./b" C = 42 return unless __FILE__ == $0 puts C ``` b.rb: ``` require "./a" ``` This results in: ``` $ ./a.rb ./a.rb:5: warning: already initialized constant C /home/johannes/t/a.rb:5: warning: previous definition of C was here 42 ``` Ruby version: ``` $ sudo docker run ruby:3.3.0-preview1 ruby --version ruby 3.3.0preview1 (2023-05-12 master a1b01e7701) [x86_64-linux] ``` **This could be solved by always adding the executed program to `$LOADED_FEATURES`.** As a workaround, executed programs can be prepended with: ``` require "pathname" if __FILE__ == $0 $LOADED_FEATURES << Pathname.new(__FILE__).expand_path.to_s end ``` -- https://bugs.ruby-lang.org/ ______________________________________________ ruby-core mailing list -- ruby-core@ml.ruby-lang.org To unsubscribe send an email to ruby-core-leave@ml.ruby-lang.org ruby-core info -- https://ml.ruby-lang.org/mailman3/postorius/lists/ruby-core.ml.ruby-lang.org/