繁体   English   中英

Elixir function 在循环中调用 2 个参数

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM