Project

General

Profile

Misc #10178

Updated by nobu (Nobuyoshi Nakada) over 9 years ago

I doubt I am seeing a bug, but I was hoping someone could clarify for me the reason why I am seeing what I see. I tried pouring over the spec and wasn't quite able to pin it down. 

 My use case of refinements is not the normal one, so this is not high priority by any means. 

 But I am curious why, if I have defined a refinement in, say, module A, and then module B is using A, if B itself as a refine block, A's refinements will not be active within it. 

 So: 

 ~~~ruby 
 module A 
   
 > refine Time 
   
 > def weekday 
     
 > self.strftime("%A") 
   
 > end 
 end 

 module B 
   
 using A 
   
 puts Time.now.weekday # 1 
   
 > refine ActiveSupport::Time 
   
 > def method_missing(method, *args) 
     
 > puts Time.now.weekday # 2 
     
 > self.to_time.send(method.to_sym, args.first) 
   
 > end 
   
 puts Time.now.weekday # 3 
 end 
 ~~~ 

 1 and 3 will be defined, but 2 will not. Is it because according to: 
 "The scope of a refinement is lexical in the sense that, when control is transferred outside the scope (e.g., by an invocation of a method defined outside the scope, by load/require, etc...), the refinement is deactivated." 
 refine transfers control outside the scope of the module, so no matter where I put using, it will not have the refinements of A active? 

 I apologize for my ignorance and greatly appreciate your answers on this matter. 

Back