Ich habe eine Befehlszeile Ruby-App, die ich entwickle, und ich möchte es einem Benutzer ermöglichen, Code, der als Filter für einen Teil des Prozesses ausgeführt wird, zu ermöglichen. Grundsätzlich ist die Anwendung tut dies:Skript eine Ruby-Kommandozeilen-App; beste Möglichkeit, dies zu tun?
- Lese in einigen Daten
- Wenn ein Filter angegeben wird, verwenden Sie es zum Filtern von Daten
- Prozess die Daten
ich den Filterprozess werden soll (Schritt 2) so flexibel wie möglich zu sein.
Mein Denken war, dass der Benutzer eine Ruby-Datei zur Verfügung stellen könnte, die eine bekannte Konstante auf ein Objekt zeigen eine Schnittstelle implementiert, definiere ich, zum Beispiel:
# user's filter
class MyFilter
def do_filter(array_to_filter)
filtered_array = Array.new
# do my filtering on array_to_filter
filtered_array
end
FILTER = MyFilter.new
Code Meine App wäre dann so etwas tun:
array_that_might_get_filtered = get_my_array()
if (options.filter_file)
require options.filter_file
array_that_might_get_filtered = FILTER.do_filter(array_that_might_get_filtered)
end
Während dies funktionieren würde, fühlt es sich kitschig und es scheint, wie es sollte eine bessere Art und Weise, es zu tun. Ich erwog auch, den Filter in der Form zu haben, einer bekannten Klasse eine Methode eines bekannten Namens hinzuzufügen, aber das schien auch nicht ganz richtig zu sein.
Gibt es ein besseres Idiom in Ruby dafür?
Viel praktischer als meine allgemeine Antwort. +1 – VonC