[#44776] [ruby-trunk - Bug #6385][Open] mtime vie File.stat(filename).utime vs File.open(filename, 'r').mtime in Windows — "kolmanv (Kolman Vornovitsky)" <kolmanv@...>

9 messages 2012/05/01

[#44782] [ruby-trunk - Bug #6387][Open] 1.9.3p194 crashed on require in ubuntu — "ywen (Yi Wen)" <hayafirst@...>

12 messages 2012/05/01

[#44795] [ruby-trunk - Bug #6391][Open] Segment Fault while execute make_encmake.rb for Ruby 1.9.3 P194 ( MinGW64) — "raylinn@... (ray linn)" <raylinn@...>

13 messages 2012/05/02

[#44911] [ruby-trunk - Bug #6408][Open] DelegateClass#eql? and <=> don't work as expected — "tenderlovemaking (Aaron Patterson)" <aaron@...>

11 messages 2012/05/06

[#44951] [ruby-trunk - Feature #6414][Open] Destructuring Assignment — "edtsech (Edward Tsech)" <edtsech@...>

14 messages 2012/05/08

[#44958] [ruby-trunk - Feature #6418][Assigned] Supporing a subset of ANSI escape code on Windows — "usa (Usaku NAKAMURA)" <usa@...>

11 messages 2012/05/09

[#45035] [ruby-trunk - Bug #6433][Open] rb_thread_blocking_region(): ubf() function is executed with GVL — ibc (Iñaki Baz Castillo) <ibc@...>

12 messages 2012/05/14

[#45180] [ruby-trunk - Feature #6478][Open] BasicObject#__class__ — "trans (Thomas Sawyer)" <transfire@...>

14 messages 2012/05/22

[#45193] [ruby-trunk - Feature #6482][Open] Add URI requested to Net::HTTP request and response objects — "drbrain (Eric Hodel)" <[email protected]>

16 messages 2012/05/23

[#45198] [ruby-trunk - Feature #6483][Open] parametric map — "prijutme4ty (Ilya Vorontsov)" <prijutme4ty@...>

14 messages 2012/05/23

[#45222] [ruby-trunk - Feature #6492][Open] Inflate all HTTP Content-Encoding: deflate, gzip, x-gzip responses by default — "drbrain (Eric Hodel)" <[email protected]>

23 messages 2012/05/24

[#45252] [ruby-trunk - Feature #6499][Open] Array::zip — "prijutme4ty (Ilya Vorontsov)" <prijutme4ty@...>

14 messages 2012/05/26

[#45272] [ruby-trunk - Feature #6503][Open] Support for the NPN extension to TLS/SSL — "igrigorik (Ilya Grigorik)" <ilya@...>

13 messages 2012/05/27

[#45316] [ruby-trunk - Feature #6515][Open] array.c: added method that verifies if an Array is part of another — "lellisga (Li Ellis Galardo)" <lellisga@...>

14 messages 2012/05/30

[ruby-core:44954] Re: [ruby-trunk - Feature #5632] Attempt to open included class shades it instead.

From: Benoit Daloze <eregontp@...>
Date: 2012-05-08 19:21:28 UTC
List: ruby-core #44954
Hello,

On 8 May 2012 20:41, boris_stitnicky (Boris Stitnicky)
<[email protected]> wrote:
> In this place, I'd also like to provide user feedback about my (unwarranted, but real)
> surprise involving a weakly related issue:
>
> module A; def initialize; puts "hello"; end; end # there was a missing end
> class B; include A end
> A = Module.new
> B.new
>> "hello"
>
> And there I was surprised. I did get constant redefine warning, but I ignored it,
> as I was writing tests and I wanted to blank out A mixin. I clung on the class
> name A, but to include statement, capital 'A' was just as irrelevant as if it
> was small 'a' (Another proof that there are actually no constants in Ruby :)

As you say, the constants are not constant in a usual sense, they are
global identifiers that should not be reassigned.

You can think of `module Name` as `Name = defined?(Name) ? Name :
Module.new` and the change of scope (same for `class Name`). That is,
if Name is already defined, just use it, otherwise create the module.

What happens here is you create a module A with a method initialize.
You then include it in B, which means adding the module instance in
the ancestors:
> B.ancestors
=> [B, A, Object, Kernel, BasicObject]

Then you actually redefine A to an empty module.

Unfortunately, if you do again
> B.ancestors
=> [B, A, Object, Kernel, BasicObject]

You still see A in the ancestors (this might be worth to be reported
as a separate issue),
although that module you see is still the old one, which name was not updated:
> B.ancestors[1].private_instance_methods
=> [:initialize]
> A.private_instance_methods
=> []

This is maybe not the most intuitive behavior, but it is consistent.
An object is not bound to a variable or a constant, and the references
are direct. The only "magic" that happens is when you assign for the
first time a class/module to a constant, it takes the name of that
constant.

In any case, avoid redefining constants as much as possible, and don't
make assumptions on constant resolution when the module is included.
If you want to ensure to re-open a class, just use
ClassName.class_exec { ... }.

In This Thread