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 sicurezza di chi scrive e soprattutto di chi utilizza i 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 a 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.