Affen-Patch, um die aktuelle Zeit zurückzugeben, wenn in Time.parse of Ruby eine leere Zeichenfolge angegeben ist

Hintergrund

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.

Fazit

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

Zum Abschluss

Zeitüberschreibung

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.

Time.parse Monkey Patch

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!

Anwenden von Time.parse Monkey Patch & alias_method

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)

Anwenden von Time.parse Monkey Patch & alias_method (Klassenmethode)

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

Schließlich

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.

Referenz

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

Klassenerweiterung

Recommended Posts

Affen-Patch, um die aktuelle Zeit zurückzugeben, wenn in Time.parse of Ruby eine leere Zeichenfolge angegeben ist
So geben Sie den Wert aus, wenn sich ein Array im Array befindet
Festlegen, wann in junit "Der Konstruktor Empty () ist nicht sichtbar" auftritt
So stellen Sie die Chronik ein, wenn sich die Zeit in CentOS7 verschiebt
Wirf eine Ausnahme und fange, wenn es keinen Handler gibt, der dem Pfad im Frühjahr entspricht
Wenn die von JNA an C ++ übergebene Zeichenfolge verstümmelt ist
Maßnahmen gegen das Vergessen, die Schriftart anzugeben, wenn titleTextAttributes angegeben wird
So erhalten Sie das aktuelle Datum als Zeichenfolge im Format JJJJMMTT
Ich möchte bei der Registrierung in der Datenbank eine Fehlermeldung anzeigen
Wenn Sie einem Argument in einer Ruby-Methode neu zuweisen und dann "super" aufrufen → Das neu zugewiesene wird verwendet
Möglichkeit bei der Bereitstellung auf EC2, aber im Fehlerprotokoll wird nichts angezeigt
Entspricht einer Eigenschaft, deren Typ mit JsonDeserializer leer wird, wenn er leer ist
[Kein Komma (,) in der Adresse! ] Dinge, die Sie beachten sollten, wenn Sie sich für eine Prüfung bei Pearson VUE bewerben
[Java] Wenn Sie eine Zeichenfolge in die switch-Anweisung einfügen, müssen Sie sie zu einem konstanten Ausdruck machen