From: merch-redmine@... Date: 2021-04-02T21:39:03+00:00 Subject: [ruby-core:103192] [Ruby master Bug#17767] `Cloned ENV` inconsistently returns `ENV` or `self` Issue #17767 has been updated by jeremyevans0 (Jeremy Evans). I don't think it makes sense to have cloned ENV objects. I propose the following behavior: * `ENV.dup`/`ENV.clone`/`ENV.clone(freeze: nil)`/`ENV.clone(freeze: false)` should return `ENV`, since the same singleton storage is used (the environ table). * `ENV.clone(freeze: true)` should raise `TypeError`, the same as `ENV.freeze`. `ENV.dup` previously returned a useless instance of `Object`, since all `ENV` behavior is defined on a singleton class. I've submitted a pull request implementing this proposal: https://github.com/ruby/ruby/pull/4350 ---------------------------------------- Bug #17767: `Cloned ENV` inconsistently returns `ENV` or `self` https://bugs.ruby-lang.org/issues/17767#change-91267 * Author: kachick (Kenichi Kamiya) * Status: Open * Priority: Normal * ruby -v: ruby 3.0.0p0 (2020-12-25 revision 95aff21468) [x86_64-darwin20] * Backport: 2.5: UNKNOWN, 2.6: UNKNOWN, 2.7: UNKNOWN, 3.0: UNKNOWN ---------------------------------------- GH-PR: https://github.com/ruby/ruby/pull/4344 Is this an expected behavior? ���� ```console $ ruby -v ruby 3.0.0p0 (2020-12-25 revision 95aff21468) [x86_64-darwin20] ``` ```ruby cloned_env = ENV.clone p ENV.each_key{}.equal?(ENV) #=> true p cloned_env.each_key{}.equal?(cloned_env) #=> true ENV.delete('TEST') err = ENV.fetch('TEST') rescue $! p err.receiver.equal?(ENV) #=> true err = cloned_env.fetch('TEST') rescue $! p err.receiver.equal?(cloned_env) #=> false ENV['TEST'] = 'TRUE' p ENV.select!{ false }.equal?(ENV) #=> true cloned_env['TEST'] = 'TRUE' p cloned_env.select!{ false }.equal?(cloned_env) #=> false ``` I guess ruby don't care `Cloned ENV` objects. Yes, anyone basically do not write these code. But the behaviors looks weird to me. ���� Should block to clone? Should return ENV? Should return self? I think `they return self` makes consistently behaviors and does not break compatibilities. So I have created this PR ���� -- https://bugs.ruby-lang.org/ Unsubscribe: