В принципе, вы ничего не можете сделать. В Ruby рекомендуется использовать отличительные имена в пространстве имен верхнего уровня точно по этой причине, и вы случайно наткнулись на две библиотеки, которые нарушают эту практику.
Одна вещь, которую вы могли бы сделать, это использовать Kernel#load
вместо Kernel#require
. Kernel#load
принимает необязательный логический аргумент, который скажет ему оценить файл в анонимном модуле. Обратите внимание, однако, что это ни в коем случае не безопасно: вполне возможно явно поместить материал в пространство имен верхнего уровня (используя что-то вроде module ::PDF
) и, таким образом, вырваться из анонимного модуля.
Обратите внимание, что API действительно дрянной: load
просто возвращает true
или false
, как require
. (На самом деле, поскольку load
всегда загружается, он всегда возвращает true
.) На самом деле get в анонимном модуле невозможно. Вы в основном должны вытащить его из ObjectSpace
вручную. О, и, конечно, поскольку на самом деле ничто не ссылается на анонимный модуль, он будет собирать мусор, так что вам не только нужно рыться в недрах ObjectSpace
до найти модуля, вы также гонка сборщик мусора.
Иногда мне бы хотелось, чтобы у Ruby была подходящая система модулей, такая как Newspeak, Standard ML или Racket.