🦔

[bugs.ruby][Bug #20342] load したときにエラーになる場合があるバグ報告

2024/03/19に公開

[Bug #20342] Top level public, private and ruby2_keywords do not work in wrapped load

  • 以下のようにトップレベルで public を使っているファイルを #load の第二引数に true を渡した状態で読み込むとエラーになるバグ報告
# load.rb
public def func = 42
# load の第二引数に true を渡した状態でトップレベルに public があるファイルを読み込むとエラーになる
# error: `public': undefined method `func' for class `Object' (NameError)
load "load.rb", true
  • true を渡した場合は無名モジュール内で読み込んだファイルが定義されるからなんですかね?
  • このバグの PR は既に出てます
  • ちなみに load の第二引数に true を渡すと無名モジュール内で load されます
# load.rb

def func = 42

class X
  def get
    func + func
  end
end
# 通常の load ではトップレベルに load.rb の内容が定義される
load "load.rb"

# load のトップレベルで定義したメソッドやクラスが参照できる
pp func
# => 42

pp X.new.get
# => 84
# true を渡した場合は無名モジュール内でメソッドやクラスが定義される
load "load.rb", true

# なのでメソッドやクラスは参照できない
# error: undefined local variable or method `func' for main (NameError)
pp func

# error: uninitialized constant X (NameError)
pp X.new.get
  • トップレベルを汚染せずに読み込みたい場合に利用できおます
GitHubで編集を提案

Discussion