Project

General

Profile

Feature #7121

Updated by hsbt (Hiroshi SHIBATA) 8 months ago

=begin 
 I was playing with Ruby tonight and thought up an interesting idea to make (({require})) a bit better, so you can load multiple files sequentially using one method call. 

 Currently, (({require})) supports one argument, and throws a (({TypeError})) if you pass an array: 

 ``` 
  

  irb(main):001:0> require %w(json yaml) 
  TypeError: can't convert Array into String 
 ``` 

 However, there's a way to patch Kernel that makes it respond to multiple objects passed in an (({Array})). 

 ``` 
  

  module Kernel 
    @@require = method :require 

    def require *args 
      args.flatten! 
      args.collect! do |a| 
        raise ArgumentError.new "arguments to `require' must be strings or symbols" unless a.is_a?(String) || a.is_a?(Symbol) 
        @@require.call a.to_s 
      end 

      args.length == 1 ? args.first : args 
    end 
  end 
 ``` 

 The new behavior doesn't actually require the modification of any code that calls (({require})) (pretty much anything, really), and new code can take advantage of the new functionality instantly. 

 ``` 
  

  irb> require %w(json yaml) 
  => [true, false] 
  irb> require :pp 
  => false 
  irb> require 'rails' 
  => true 
  irb> require %w(json yaml), :pp, 'rails' 
  => [true, false, false, true] 
 ``` =end 

 Thanks for considering this.

Back