Project

General

Profile

Feature #14332

Updated by Eregon (Benoit Daloze) over 2 years ago

Module.used_modules was added in #7418. 
 But I think `Module.used_refinements` is more useful or at least complementary. 

 Refinements were implemented in TruffleRuby, and I found Module.used_refinements so useful that I left it there. 

 Instead of listing namespace modules (arguments to #using), it lists the refinement modules: 

 ~~~ ruby 
 module Json 
   refine Integer do 
     def to_json 
       to_s 
     end 
   end 

   refine String do 
     def to_json 
       inspect 
     end 
   end 
 end 

 module Fact 
   refine Integer do 
     def fact 
       self <= 1 ? 1 : self * (self-1).fact 
     end 
   end 
 end 

 using Json 
 p Module.used_modules # => [Json] 
 p Module.used_refinements # => [#<refinement:Integer@Json>, #<refinement:String@Json>] 

 using Fact 
 p Module.used_modules # => [Json, Fact] 
 p Module.used_refinements # => [#<refinement:Integer@Fact>, #<refinement:Integer@Json>, #<refinement:String@Json>] 
 ~~~ 

 This shows which classes are refined and by which refinement namespace. 
 It also shows if a class has multiple active refinements in the scope. 
 And, last but not least, the name of the method is contains "refinements". 
 I find `used_modules` hard to remember and it doesn't sound related to refinements from the name (while looking at the Module's methods).

Back