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