[RAILS] Kehren Sie nicht zurück, wenn Sie Notizen in Ruby machen

Das Fazit ist, dass Sie nicht frühzeitig zurückkehren sollten, wenn Sie Notizen in Ruby machen (wahrscheinlich nicht nur in Ruby).

def user
  @user ||= begin
    user = User.find_or_initialize_by(id: 1)
    return user if user.persisted? #Beim Definieren von Instanzvariablen nicht zurückkehren
    
    user.save
    user
  end
end
def user
  @user ||= begin
    user = User.find_or_initialize_by(id: 1)
    if user.persisted?
      user
    else
      user.save
      user
    end
  end
end

#Oder

def user
  @user ||= begin
    user = User.find_or_initialize_by(id: 1)
    user.save if user.new_record?
    user
  end
end

Wenn Sie Memos in Ruby (Rails) verwenden, können Sie Folgendes schreiben.

def user
  @user ||= User.first
end

Wenn es mehrere Zeilen gibt, schließen Sie sie in "begin" ~ "end" ein.

def user
  @user ||= begin
    user = user.find_or_initialize_by(id: 1)
    if user.persisted?
      user
    else
      user.save
      user
    end
  end
end

Verwenden wir die frühe Rückkehr, eine gängige Refactoring-Technik.

def user
  @user ||= begin
    user = User.find_or_initialize_by(id: 1)
    return user if user.persisted?
      
    user.save
    user
  end
end

Auf den ersten Blick sieht es gut aus, aber wenn ich diese Methode auf der Rails-Konsole ausführe, sieht es so aus:


[1] pry(main)> def user
[1] pry(main)*   @user ||= begin
[1] pry(main)*     user = User.find_or_initialize_by(id: 1)
[1] pry(main)*     return user if user.persisted?
[1] pry(main)*
[1] pry(main)*     user.save
[1] pry(main)*     user
[1] pry(main)*   end
[1] pry(main)* end
=> :user
[2] pry(main)> user
  User Load (3.4ms)  SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 LIMIT 1
=> #<User:0x00007ff0b4d2e338
 id: 1,
 created_at: Tue, 09 Jun 2020 15:04:04 JST +09:00,
 updated_at: Tue, 09 Jun 2020 15:04:04 JST +09:00>
[3] pry(main)> user
  User Load (1.8ms)  SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 LIMIT 1
=> #<User:0x00007ff0ad554740
 id: 1,
 created_at: Tue, 09 Jun 2020 15:04:04 JST +09:00,
 updated_at: Tue, 09 Jun 2020 15:04:04 JST +09:00>

Es werden keine Memos erstellt und jedes Mal wird eine Abfrage ausgegeben. Wenn Sie die Referenz erneut überprüfen,

Ruby 2.7.0 Referenzhandbuch https://docs.ruby-lang.org/ja/latest/doc/spec=2fcontrol.html#return return Beendet die Methodenausführung mit dem Wert des Ausdrucks als Rückgabewert.

Da es eine Anweisung gibt, endet die user -Methode in der Phase von return und die Instanzvariable von @ user bleibt nil, sodass der Prozess jedes Mal ausgeführt wird. Es ist natürlich, wenn Sie darüber nachdenken, aber seien Sie vorsichtig, da Sie möglicherweise süchtig nach dem Schreiben werden, dass Sie in Ihrer Gewohnheit häufig frühe Renditen verwenden.

Recommended Posts

Kehren Sie nicht zurück, wenn Sie Notizen in Ruby machen
Seien Sie vorsichtig, wenn Sie die Rückkehr in Ruby weglassen
Was tun, wenn die Methode in f: ajax nicht gefunden wurde?
Codierung unter Windows + Ruby
[Java] Verwenden Sie nicht "+" im Anhang!
Was tun, wenn die Änderungen im Servlet nicht berücksichtigt werden?
darf nicht in der for-Anweisung zurückgegeben werden
Akzeptieren Sie System.in nicht im Gradle-Lauf
Deklarieren Sie keine Variablen in List in Java
Was tun, wenn blockierter Host: "Hostname" in Ruby on Rails angezeigt wird
Escape-Verarbeitung beim Erstellen einer URL in Ruby
Verhalten, wenn Platzhalter (**) in Ruby angegeben ist
Endgültige Bestätigung, wenn die Ruby-Version nicht wechselt
Schwer in Rubin! ??
Was tun beim Debuggen von "Quelle nicht gefunden"?
Was tun, wenn in PlayFramework eine IllegalStateException auftritt?
rbenv-Versionen und ruby -v-Versionen stimmen nicht überein
Wenn das Projekt nicht in Eclipse angezeigt wird
Im Warndialog beim Starten des Applets funktioniert die Prüfung "Beim nächsten Mal nicht anzeigen" nicht
Was tun, wenn JSF-Tags nicht zu HTML werden?
Ausgabedreieck in Ruby
Arten von Variablen in Ruby
Schneller Popcount in Ruby
[Entwicklungsprotokoll ⑬] Lassen Sie 0 nicht in das Formular eingeben !!