这似乎是一件简单的事情,但我似乎没有找到一个足够简单的答案,让我去摸索。
因此,假设我有一个类似于这样的药剂功能:
def fetch_card_ids(offset, total_cards) when offset < total_cards do
url = "http://some.domanin?offset=#{offset}"
response = HTTPotion.get url
#return or yield response here
fetch_card_ids(offset+24,total_cards)
end
在C#中,我可以在迭代某些东西时产生一个返回值,这当然与递归不一样,但无论如何:我可以在灵丹妙药中的递归函数中做类似的事情吗?
当然,任何帮助都是非常感谢的。
发布于 2015-12-27 01:59:27
如果您想要做的是“流”对调用者的响应,那么Stream
是一个很好的方法。例如,您可以使用Stream.unfold/2
def fetch_card_ids(offset, total_cards) do
Stream.unfold offset, fn
off when off < total_cards ->
resp = HTTPotion.get(url)
{resp, off + 24}
_ ->
nil
end
end
该流将在每次获取它们时“生成”响应,并在offset
大于total_cards
时停止。
发布于 2015-12-27 03:24:37
这样使用流怎么样?
top = div(total_cards,24) +1 # integer division
result = Stream.map( 0..top, fn (offset) ->
url = "http://some.domanin?offset=#{24*offset}"
HTTPotion.get url
end ) |> Enum.to_list
在这里,Enum.to_list
只是在最后“生成”列表,但您也可以使用Stream.take
等工具,在逐步的时间内从该列表中处理
https://stackoverflow.com/questions/34479310
复制