require
на самом деле является методом, это Kernel#require
(который вызывает rb_require_safe
), так что вы можете по крайней мере выполнить свою хакерскую работу в залатанной обезьяной версии. Если тебе нравятся такие вещи.
- Псевдоним orignal требуется с дороги
- Если передан абсолютный путь, вызвать оригинальный метод require
- Иначе переберите путь загрузки, создав абсолютный путь и вызвав оригинальный метод require.
Просто ради забавы, я немного постарался, прототип ниже. Это не полностью протестировано, я не проверил семантику rb_require_safe
, и вам, вероятно, также нужно взглянуть на #load
и #include
для полноты - и это остается обезьяньим патчем Kernel
модуль. Возможно, это не совсем чудовищно, но это, безусловно, взломать. Ваш звонок, если это лучше или хуже, чем возиться с глобальной переменной $:
.
module Kernel
alias original_require require
# Just like standard require but takes an
# optional second argument (a string or an
# array of strings) for additional directories
# to search.
def require(file, more_dirs=[])
if file =~ /^\// # absolute path
original_require(file)
else
($: + [ more_dirs ].flatten).each do |dir|
path = File.join(dir, file)
begin
return original_require(path)
rescue LoadError
end
end
raise LoadError,
"no such file to load -- #{file}"
end
end
end
Примеры:
require 'mymod'
require 'mymod', '/home/me/lib'
require 'mymod', [ '/home/me/lib', '/home/you/lib' ]