Gibt es eine sauberere Möglichkeit, dies zu schreiben? (Rubin/Schienenblöcke, Rückgabewert)
-
25-09-2019 - |
Frage
def find_users_online(count = 1)
users = Array.new
count.times do
users += get_users_online
end
users # <==== I want to remove this here
end
Im obigen Code muss IM die Variable "Benutzer" am Ende der Funktion erneut einsetzen, um den richtigen Wert zurückzugeben (Benutzer). Aber ist es möglich, dass der Blockblock der Times die Benutzerwerte zurückgibt und ich "Benutzer" am Ende der Funktion entfernen kann?
def find_users_online(count = 1)
users = Array.new
count.times.and_return do # <== something like this
users += get_users_online
end
end
Lösung
Schauen Sie sich #TAP an. Es ist der neu gefangene Weg, "zurückzukehren".
def find_users_online(count = 1)
[].tap do |users|
count.times { users += get_users_online }
end
end
Andere Tipps
Lavirs Lösung ist gut, wenn Get_Users_online denselben Wert zurückgibt, den er aufgerufen wird. Wenn nicht, brauchen Sie so etwas:
count.times.map {get_users_online}.flatten
Eine andere Option ist Rückkehr Block
returning(users = Array.new) do |users|
count.times { users += get_users_online }
end
Wie wäre es mit
def find_users_online(count = 1)
(1..count).map{ get_users_online }.flatten
end
?
get_users_online * count
Aber get_users_online () muss den gleichen Wert zurückgeben, während diese Funktion ausgeführt wird.
Wenn dies nicht Ihr Fall ist, verwenden Sie
(1..count).map { get_users_online }.reduce(:+)
oder mit Facetten:
count.of { get_users_online }.sum
Es gibt auch interessantere Möglichkeiten:
(1..count).inject(Array.new) { |ignore, users| users + get_users_online }