TL; DR;
Wie kann ich eine Methode (geschrieben in der Mitte von Nirgendwo) aus einer Ruby-Kernklasse aufrufen?Aufruf einer benutzerdefinierten Methode aus einer Ruby-Kernklasse
Ich schreibe ein Skript, das Textdateien verwaltet. Hier ist mein Code:
File.open("file.txt", "w").each do |f|
f.puts "Text to be inserted"
f.puts text_generated
f.puts "Some other text" if some_condition?
f.puts ""
end
Ich möchte den Code bereinigen, indem sie ein Verfahren zur Einführung:
File.open("file.txt", "w").each do |f|
f.puts_content(text_generated, some_condition?
# -> Generates an error: private method called for <File> (NoMethodError)
end
def puts_content(text, cond)
puts "Text to be inserted"
puts text
puts "Some other text" if cond
puts ""
end
Aber in der Tat ist diese Methode nicht aufrufbar aus der File
Klasse wegen der privaten Methode Zugang.
Kann jemand diesen Fehler erklären, und wie kann ich das tun?
Meine Abhilfe ist, diese Methoden in einem benutzerdefinierten MyFile
Klasse, die von File
erbt zu schreiben:
MyFile.open("file.txt", "w").each do |f|
f.puts_content # Seems to work
end
class MyFile < File
def puts_content(cond)
puts "Text to be inserted"
puts text_generated_elsewhere
puts "Some other text" if cond
puts ""
end
end
ich das Zeug direkt in File
setzen könnte, aber ich bin ängstlich, wenn es zu berühren kommt eine Sprachkernbibliothek.
Ich möchte wissen, ob dies ein guter Weg ist, es zu tun.
Es ist möglich, Ruby-Core-Methoden von anderen Kernmodulen/Klassen aufzurufen. Bedeutet dies, dass alle Kernmodule/-klassen einander umfassen oder erfordern? Wie funktioniert es unter der Haube?
Hallo, ich habe noch nie von Verfeinerungen gehört, danke * (übrigens, [hier ist die Dokumentation] (https://ruby-doc.org/core-2.4.2/doc/syntax/refinements_rdoc.html) für die letzte Version (2.4.2) und Refinements ist kein experimentelles Feature mehr) *. Aber ich mag deinen ersten Vorschlag sehr. Die Gesamtstruktur bleibt genau gleich und die Absicht wird nicht geändert. Ich sollte ein bisschen mehr darüber lernen, wie all das Zeug (statische Klasse) zusammenpasst. Wie wäre es mit einem Modul? Ich habe von Modul gehört, dass es mit anderen Klassen und Methoden "gemischt" werden könnte. – SanjiBukai
Sie können die Methode in ein Modul schreiben (es sieht genauso aus wie die Verfeinerungsdefinition, nur ohne die 'refine File do'-Zeile) und dann schließen Sie es mit 'File.include FileUtils' ein, aber es ist im Grunde dasselbe, als die Dateiklasse wieder zu öffnen, um die Methode hinzuzufügen –
Danke. Es ist klar, die Verwendung einer statischen Klasse ist immer noch meine Lieblingsmethode. Danke nochmal. – SanjiBukai