From: merch-redmine@... Date: 2017-11-21T17:11:27+00:00 Subject: [ruby-core:83857] [Ruby trunk Feature#14123] Kernel#pp by default Issue #14123 has been updated by jeremyevans0 (Jeremy Evans). Eregon (Benoit Daloze) wrote: > The thread safety problem is due to `undef`, right? Correct. The `pp` library defines `Kernel#pp`, so in verbose mode if you don't undef or remove the method first, this causes a warning in verbose mode. I think a verbose mode warning is preferable to thread-unsafe code. Here's a possible alternative implementation: ~~~ruby module Kernel def pp(*a) require 'pp' rescue LoadError p(*a) else pp(*a) end end ~~~ To avoid the verbose mode warning, we could have `pp` include a different module in `Object` instead of modifying `Kernel` directly, and then use `Kernel.send(:remove_method, :pp)` to remove the method, but we'd need to rescue `NameError` raised by the `remove_method` call to ensure thread safety in that case. Note that in all of these cases, `Kernel#pp` will break if `Kernel` is frozen. ---------------------------------------- Feature #14123: Kernel#pp by default https://bugs.ruby-lang.org/issues/14123#change-67886 * Author: mame (Yusuke Endoh) * Status: Open * Priority: Normal * Assignee: matz (Yukihiro Matsumoto) * Target version: 2.5 ---------------------------------------- Matz, may I commit this? I really want this. ``` diff --git a/prelude.rb b/prelude.rb index 7b98e28285..87f49ac9fb 100644 --- a/prelude.rb +++ b/prelude.rb @@ -141,3 +141,11 @@ def irb irb end end + +module Kernel + def pp(*objs) + undef :pp + require 'pp' + pp(*objs) + end +end ``` -- https://bugs.ruby-lang.org/ Unsubscribe: