Невозможно переопределить весь класс Ruby таким образом, но я думаю, что возможно , чтобы предотвратить загрузку исходного класса ... если он использует автозагрузку. Мне было любопытно, поэтому я проверил https://github.com/sstephenson/sprockets/blob/master/lib/sprockets.rb, и да, Sprockets использует автозагрузку.
autoload :Base, "sprockets/base"
Важно, что не не загружает код. Он просто сообщает Ruby, что если / когда когда-либо встречается неопределенная константа, называемая «Sprockets :: Base», загрузить ее из указанного файла. Ваш патч определяет Sprockets :: Base до того, как он когда-либо вызывался, тем самым предотвращая загрузку исходного файла.
Когда вы перенесли ваш патч в Rakefile, что-то в Rails уже ссылалось на Sprockets :: Base, загружая оригинальный код. Затем ваш патч нанесен сверху.
На самом деле я никогда не использовал автозагрузку, поэтому я не уверен, как должны обрабатываться подобные случаи. Я держу пари, что это будет работать:
Sprockets::Base
class Sprockets::Base
def digest
...
Сначала ссылаясь на класс, вы должны заставить Ruby загрузить исходный класс. Тогда вы можете спокойно заняться переопределением одного из его методов.