Wenn Sie beim Upgrade von Ruby von 1.8.7 auf 1.9.3 eine leere Zeichenfolge im Argument von Time.parse angeben, tritt eine Ausnahme auf.
[EXCEPTION] ArgumentError: Tritt auf, wenn das Datum eine leere Zeichenfolge erhält. Vor 1.9.2 wurde keine Ausnahme ausgelöst und eine Instanz von Time, die die aktuelle Zeit darstellt, zurückgegeben.
Ruby 1.9.2 Referenzhandbuch Time.parse
Da es in Time.parse zu viele Stellen gab, an denen leere Zeichen angegeben wurden, und es schwierig war, diese zu beheben, habe ich beschlossen, Time.parse einen Affen-Patch zuzuweisen, um das Problem zu lösen.
Wenn eine leere Zeichenfolge angegeben wird, wird Time.now zurückgegeben. Ansonsten handelt es sich um einen überschreibungsähnlichen Prozess, der die Analysemethode der integrierten Klasse aufruft.
class Time
class << self
alias_method :__parse__, :parse
private :__parse__
def parse(time)
if time.empty?
#Gibt die aktuelle Zeit zurück
Time.now
else
#Eingebaute Unterrichtszeit.Parse aufrufen
__parse__(time)
end
end
end
end
Es ist auch möglich, es mit self.parse zu definieren.
class Time
class << self
alias_method :__parse__, :parse
private :__parse__
end
def self.parse(time)
if time.empty?
#Gibt die aktuelle Zeit zurück
Time.now
else
#Eingebaute Unterrichtszeit.Parse aufrufen
__parse__(time)
end
end
end
Ich wollte nach leeren Zeichenfolgen suchen, während ich die integrierte Klasse Time nutzte, also dachte ich, ich sollte Time erben und überschreiben. Beim Erben ist es jedoch erforderlich, den Klassennamen als Alias festzulegen und alle Stellen, an denen Time.parse (arg) verwendet wird, in den neuen Klassennamen zu ändern. Ich gab auf, weil dies das Ende der Geschichte war.
Als nächstes dachte ich über das Affenfeld nach. Cookpad unterstützte auch den Affen-Patch, also habe ich darauf hingewiesen. (Es wurde geschrieben, dass Sie es nicht so oft wie möglich tun sollten.) So wenden Sie Affen-Patches in Ruby on Rails-Anwendungen an
Ich habe eine Erweiterungsklasse für Time vorbereitet und wie folgt definiert.
class Time
def self.parse(time)
if time.empty?
Time.now
else
Time.parse(time)
end
end
end
Dies ist jedoch ein Fehler. Dies ist auch NG, da die Erweiterungsklasse Time.parse ständig aufgerufen wurde und zu einer Endlosschleifensituation geworden ist.
irb(main):002:0> Time.parse('2020-01-01 12:34:56')
SystemStackError: stack level too deep
from /usr/local/lib/ruby/1.9.1/irb/workspace.rb:80
Maybe IRB bug!
Ich habe untersucht, ob es eine Möglichkeit gibt, die Erweiterungsklasse Time.parse aus dem vorherigen Code aufzurufen, und auf den folgenden Artikel verwiesen. Vorhandene Methode überschreiben ](https://qiita.com/umanoda/items/33613b94ccabf7b1f851)
Durch die Verwendung von "alias_method" und die Änderung des Methodennamens "parse" der Erweiterungsklasse "Time" in "parse" schien die vorherige Endlosschleife vermieden zu werden. Um auf der sicheren Seite zu sein, definieren Sie es als "privat", damit es nicht von außen aufgerufen wird.
class Time
alias_method :__parse__, :parse
private :__parse__
def self.parse(time)
if time.empty?
Time.now
else
Time.parse(time)
end
end
end
Dann erhalte ich eine Fehlermeldung, wenn es keine "Parse" -Methode gibt. Da parse eine Klassenmethode ist, konnte alias_medhod nicht angewendet werden.
bundle exec rails c
`alias_method': undefined method `parse' for class `Time' (NameError)
Ich habe im Folgenden darauf verwiesen, wie eine Klassenmethode alias_method ist. Alias zur Klassenmethode hinzufügen
Es kann angewendet werden, indem alias_method
in der Klasse << self definiert wird.
Die endgültige Form ist hier.
class Time
class << self
alias_method :__parse__, :parse
private :__parse__
end
def self.parse(time)
if time.empty?
Time.now
else
__parse__(time)
end
end
end
Es ist auch möglich, die Analysemethode in der Klasse << self wie unten gezeigt zu definieren. In diesem Fall ist Selbst nicht notwendig.
class Time
class << self
alias_method :__parse__, :parse
private :__parse__
def parse(time)
if time.empty?
Time.now
else
__parse__(time)
end
end
end
end
Ich denke, dass es derzeit nur wenige Umgebungen gibt, in denen Ruby 1.8.7 verwendet wird, aber ich hoffe, dass dies für die Aktualisierung des Legacy-Codes hilfreich sein wird. Ich denke auch, dass es für die Methode des Affen-Patches der eingebauten Klasse hilfreich sein wird, also hoffe ich, dass es hilft.
Ruby 1.9.2 Referenzhandbuch Time.parse
So wenden Sie Affen-Patches in Ruby on Rails-Anwendungen an
Vorhandene Methode überschreiben ](https://qiita.com/umanoda/items/33613b94ccabf7b1f851)
Alias zur Klassenmethode hinzufügen
Recommended Posts