Project

General

Profile

Feature #5632

Updated by mame (Yusuke Endoh) almost 6 years ago

``` 
 # Hello everyone. I'm not a very advanced ruby user, and I 
 # would like to provide and outsider report on certain ruby 
 # behavior that might surprise newbies. 

 module A 
   class X 
     def hello; puts 'hello' end 
   end 
 end 

 module B 
   include A 
 end 

 B::X.new.hello 
 => hello 
 # As expected. 

 # But when I tried to add new functionality to X, ... 
 module B 
   class X 
     def goodbye; puts 'goodbye' end 
   end 
 end 

 B::X.new.hello 
 => NoMethodError 

 # I was surprised, that my .hello method disappeared, 
 # when all I was trying to do, was to improve X in B. 
 # I actually somehow expected to work on a subclass 
 # of X, like this: 

 module C 
   include A 
   class X < X 
     def goodbye; puts 'goodbye' end 
   end 
 end 

 # My suggestions are: 
 # 1. I consider 'class X < X' syntax a little bit 
 #      mysterious. How about making this a default 
 #      behavior for 'class X' statements? 
 # 2. If the above is not considered beneficial, I 
 #      would welcome if 'class X' statement warned 
 #      when shadowing an existing name. People might 
 #      often assume that they are opening an existing 
 #      class, rather than getting a brand new one 
 #      shadowing the previous one. If people really 
 #      want a brand new shadowing class without warning 
 #      they could use explicit 'X = Class.new'. 
 ```

Back