[英]Elixir function calling in a loop with 2 parameters
在 Elixir 中是否可以使用 2 个参数调用 function i 次? 它会在 Java 中看起来像这样:
List myList = new ArrayList();
for(int i=1; i<10; i++) {
myList.addAll(doSomething(other_list,i))
}
最直接的方法是使用Enum.map/2
:
Enum.map(1..10, fn i -> do_something(other_list, i) end)
或理解for
for i <- 1..10, do: do_something(other_list, i)
话虽如此,这实际上取决于do_something
正在做什么。 Elixir 列表是链表:如果您计划访问“循环”内的第i
个元素,您的时间复杂度将是二次的。 您可能需要重新考虑处理元素而不是列表的方法, Enum.with_index/2
应该会有所帮助:
other_list
|> Enum.take(10)
|> Enum.with_index(fn element, i -> do_something2(element, i) end)
根据您的 Java 代码,我想doSomething(otherList, i)
返回一个列表。 如果是这样,那么您可以在 Elixir 中使用Enum.flat_map
,如下所示:
Enum.flat_map(1..9, fn i ->
do_something(other_list, i)
end)
在函数式编程中,您必须以不同的方式处理数据。 你发送数据,处理它,然后取回数据。 在 Java 中,您希望将每次迭代存储在外部循环中,在 Elixir 中,您只想与数据交互(处理它)然后将其吐出。 为此,您需要使用Enum.map方法。 这将返回每次迭代吐出的数据列表。
例如:
iex(3)> Enum.map(1..9, &(&1 + 1))
[2, 3, 4, 5, 6, 7, 8, 9, 10]
所以对于你的 function
defmodule Something do
def do_something(index) do
index + 1
end
end
将在 iex 中返回:
iex(7)> Enum.map(1..9, fn index ->
...(7)> Something.do_something(index)
...(7)> end)
[2, 3, 4, 5, 6, 7, 8, 9, 10]
这里的主要内容是了解功能和 OOP 编程之间的区别。 主要区别在于处理数据的方式。 这里解释得很好
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.