2016-12-12 2 views
0

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.

Antwort

0

Wie ich in der Frage erwähnt habe, kann man das funktionale Äquivalent der Erweiterung des Kernel-Moduls durchführen, indem man stattdessen die Object-Klasse verwendet.

Das andere Beispiel, das ich das Modul Enumerable gab, wodurch es praktisch durch die Enumerator-Klasse erweitert werden kann, stellt sich heraus:

module Patch 
    refine Enumerator do 
    def patched? 
     true 
    end 
    end 
end 

class Test 
    using Patch 
    Array.new.to_enum.patched? 
end 

Also ich denke, eine praktikable Lösung versuchen, nicht und biegen in die Core-Module sein könnte Klassen, sondern erweitern Sie Klassen, die sie bereits enthalten.

In diesem Fall habe ich mit Enumerator < Enumerable überprüfen könnte, die true zurückgibt, weil die Enumerator-Klasse die Enumerable-Modul enthält

(obwohl es nicht, wenn es erweitert ist schon nicht überprüft)

nach an der corefines Quelle der Suche zu aktualisieren Fand ich eine hilfreiche Methode, um alle Klassen zu finden, die ein Modul classes_including_module

enthalten
Verwandte Themen