🕌
[Bug #20573] 警告が有効なときのみ Warning#warn が呼び出されるようにする
[Bug #20573] Warning.warn shouldn't be called for disabled warnings
-
Warning#warn
は警告が出力されるタイミングで呼び出される Ruby のメソッド
module Warning
def self.warn(message, category:)
pp category => message
end
end
def get_var
$=
end
get_var
# output: {:deprecated=>"/tmp/vlhK9hI/25:8: warning: variable $= is no longer effective\n"}
- カテゴリごとの警告は
Warning[]
で制御できるんですが『無効になっているときには#warn
は呼び出されるべきではない』というバグ報告 - 現状は無効になっていても
Warning#warn
が呼び出される
module Warning
def self.warn(message, category:)
pp category => message
end
end
def get_var
$=
end
# deprecated の警告は無効になっているが Warning.warn が呼び出される
pp Warning[:deprecated] # => false
get_var
# output: {:deprecated=>"/tmp/vlhK9hI/25:8: warning: variable $= is no longer effective\n"}
- 開発版の Ruby 3.4 では無効になっている警告は
Warng#warn
が呼び出されないようになりました
module Warning
def self.warn(message, category:)
pp category => message
end
end
def get_var
$=
end
# deprecated の警告が無効な場合は deprecated の Warning#warn は呼び出されない
pp Warning[:deprecated] # => false
get_var
# Ruby 3.3 => output: {:deprecated=>"/tmp/vlhK9hI/25:8: warning: variable $= is no longer effective\n"}
# Ruby 3.4 => output: non
# deprecated の警告が有効な場合は deprecated の Warning#warn が呼び出される
Warning[:deprecated] = true
pp Warning[:deprecated] # => true
get_var
# Ruby 3.3 => output: {:deprecated=>"/tmp/vlhK9hI/25:8: warning: variable $= is no longer effective\n"}
# Ruby 3.4 => output: {:deprecated=>"/tmp/vlhK9hI/25:8: warning: variable $= is no longer effective\n"}
- またこれによりパフォーマンスが向上するとのこと
puts RUBY_DESCRIPTION
eval "def test; " +
1000.times.map { "$=" }.join(";") + "; end"
def run_benchmark count
i = 0
while i < count
start = Process.clock_gettime(Process::CLOCK_MONOTONIC)
yield
ms = Process.clock_gettime(Process::CLOCK_MONOTONIC) - start
puts "itr ##{i}: #{(ms * 1000).to_i}ms"
i += 1
end
end
run_benchmark(25) do
250.times do
test
end
end
ruby 3.3.3 (2024-06-12 revision f1c7b6f435) [x86_64-linux]
itr #0: 157ms
itr #1: 133ms
itr #2: 108ms
itr #3: 109ms
itr #4: 112ms
itr #5: 112ms
itr #6: 112ms
itr #7: 112ms
itr #8: 113ms
itr #9: 113ms
itr #10: 113ms
itr #11: 112ms
itr #12: 112ms
itr #13: 112ms
itr #14: 117ms
itr #15: 108ms
itr #16: 108ms
itr #17: 110ms
itr #18: 109ms
itr #19: 112ms
itr #20: 113ms
itr #21: 112ms
itr #22: 112ms
itr #23: 112ms
itr #24: 112ms
ruby 3.4.0dev (2024-06-15T20:14:58Z master ef423dd6d4) [x86_64-linux]
itr #0: 2ms
itr #1: 2ms
itr #2: 2ms
itr #3: 2ms
itr #4: 2ms
itr #5: 2ms
itr #6: 2ms
itr #7: 2ms
itr #8: 2ms
itr #9: 2ms
itr #10: 2ms
itr #11: 2ms
itr #12: 2ms
itr #13: 2ms
itr #14: 2ms
itr #15: 2ms
itr #16: 2ms
itr #17: 2ms
itr #18: 2ms
itr #19: 2ms
itr #20: 2ms
itr #21: 2ms
itr #22: 2ms
itr #23: 2ms
itr #24: 2ms
Discussion