Mam metodę, która może tylko załadować 50
obiektów na raz.
Więc wymyśliłem ten fragment kodu ruby, który będzie ładowany, dopóki nie będzie już żadnych wyników:
objects = []
offset = 0
limit = 50
loop do
# Load paged objects using the current given offset
new_objects = load_objects(some_url, limit: limit, start: offset)
offset += limit
objects.concat(new_objects)
# End the loop as soon as no more results are returned
break if new_objects.count == 0
end
Teraz, gdy to działa świetnie, zastanawiałem się, czy istnieje bardziej zwięzły sposób wykonania tego zadania w języku Ruby.
Aktualizacja: Myślę o niektórych collect
podejście podobne do tego:
# Pseudocode
objects = update_while_true([],0) do |result_array, limit|
new_objects = load_objects(some_url, limit: 50, start: current)
result_array.concat(new_objects)
limit += 50
# Should the loop be run again?
new_objects.count > 0
end
Odpowiedzi:
1 dla odpowiedzi № 1Wyodrębniłbym to do metody, więc Twój kod wyglądałby tak:
limit = 50
objects = until_there_are_no_more_results do |offset|
load_objects(some_url, limit: limit, start: offset)
end
Wyodrębniona metoda zawierałaby bardzo ogólny kod, coś takiego (nieprzetestowane):
def until_there_are_no_more_results(&loader_proc)
objects = []
offset = 0
loop do
# Load paged objects using the current given offset
new_objects = loader_proc.call(offset) # or: yield(offset)
offset += limit
objects.concat(new_objects)
# End the loop as soon as no more results are returned
break if new_objects.count == 0
end
objects
end
Możesz pominąć parametr bloku i użyć yield
jak poniżej, ale wolę mieć to w sygnaturze metody dla przejrzystości.
def until_there_are_no_more_results
#...
new_objects = yield(offset)