假设您有以下列表理解:
for i <- 2..n |> Enum.map(&(&1*&1+ &1), i <= :math.sqrt(n), do
Refrigerator.put(pid, i, "this is my food")
end
是否有惯用的方法来禁用返回结果理解?
对于这样的情况,我对返回的理解不感兴趣,但for
使副作用函数生成所需的参数非常容易。
答案 0 :(得分:2)
如果这是关于为大n
建立回报的内存消耗,我想你也想避免Enum.map
超过2..n
。
您是否尝试过使用Streams?
2..n
|> Stream.map(& &1*&1 + &1)
|> Stream.filter(& &1 <= :math.sqrt(n))
|> Enum.each(& Refrigerator.put(pid, &1, "this is my food"))
答案 1 :(得分:1)
我不能说这是多么惯用,但如果你担心效率,你总是可以制作一个实现Collectable
的结构,但实际上并没有做任何工作
defmodule NoCollect do
defstruct []
end
defimpl Collectable, for: NoCollect do
def into(pool) do
{pool, fn
expr, {:cont, _} -> expr
expr, :done -> expr
_ , :halt -> :ok
end}
end
end
然后就可以这样使用
for ..., into: %NoCollect{} do
# ...
end
然后你在技术上仍然会得到一个理解对象,但现在它将是一个微不足道的%NoCollect{}
对象,无论循环运行多少次,而不是实际累积然后丢弃值。