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.