Misc #10178
Updated by nobu (Nobuyoshi Nakada) about 10 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.