Ich gehe durch die Facets-API und wähle einige Methoden aus, die ich in meine Verfeinerung-kompatible Patch-Bibliothek aufnehmen kann.Verwenden von Verfeinerungen zum Patchen eines Core-Moduls wie Kernel
Ich habe einen Haken gefunden, Kernel Kernel zu patchen. Es ist ein Modul, während die anderen Sachen, die ich gepatcht habe, hat Klassen gewesen (String, Array usw.)
Hier Beweis ist, die nicht raffiniert werden kann, kann mein Standardansatz für Core-Klassen:
module Patch
refine Kernel do
def patched?
true
end
end
end
# TypeError: wrong argument type Module (expected Class)
# from (pry):16:in `refine'
ich habe auch versucht, das Kernel-Modul in einer Klasse Einwickeln, und die globale Referenz Ändern dieser Klasse auf Kernel.
class MyKernel
include Kernel
extend Kernel
end
# not sure if Object::Kernel is really the global reference
Object::Kernel = MyKernel
module Patch
refine MyKernel do
def patched?
true
end
end
end
class Test
using Patch
patched?
end
# NoMethodError: undefined method `patched?' for Test:Class
# from (pry):15:in `<class:Test>'
In diesem Fall konnte ich erfolgreich die gleiche Funktionalität erhalten, indem Kernel mit Objekt zu ersetzen:
module Patch
refine Object do
def patched?
true
end
end
end
class Test
using Patch
patched?
end
Aber ich bin nicht sicher, ob ich diese Gleichwertigkeit mit anderen Core-Module bekommen könnten solche als Enumerierbar.