require_relative in ruby 1.9 e la retrocompatibilità con ruby 1.8

A partire da ruby 1.9 è obbligatorio utilizzare l’istruzione:

require_relative 'pkg'

affinché venga importato il modulo ‘pkg’ presente nella stessa directory in cui è presente il modulo che stiamo scrivendo. Mi spiego meglio: dato un modulo ruby detto ‘pkg’, se vogliamo importarlo in un altro file (chiamiamolo ‘foo’ per semplicità), dobbiamo scrivere:

  • in ruby 1.8: require 'pkg'
  • in ruby 1.9: require_relative 'pkg'
Questo accorgimento è utilizzato per aumentare la security di chi scrive e soprattutto di chi utilizza programmi: nel caso in cui siano definiti più moduli ‘pkg’ (uno in gems e uno locale), quale dovrebbe importare l’interprete?
La soluzione è assolutamente valida, ma richiede un po’ di manutenzione per garantire la retrocompatibilità con ruby 1.8. Infatti, per permettere a ruby 1.8 di interpretare correttamente l’istruzione ‘require_relative’ dobbiamo procedere ad un workaround dichiarando l’implementazione di tale istruzione:
unless Kernel.respond_to?(:require_relative)
  module Kernel
    def require_relative(path)
      require File.join(File.dirname(caller[0]), path.to_str)
    end
  end
end

A questo punto è sufficiente utilizzare require_relative anche in ruby 1.8 per non avere più problemi.

Leave a Reply