在Elixir中实现外/内循环的最佳方法

cyb*_*dot 3 elixir

在Elixir中实现以下代码的最佳/正确方法是什么:

 foreach( var item in items) {

  foreach(var num in get_nums_from(item)) {

        yield return is_valid(num) ? num : -1;
 }  }
Run Code Online (Sandbox Code Playgroud)

非常感谢.

bit*_*ker 6

假设懒惰不是必需的另一种方法是列表理解:

for item <- items, num <- get_nums_from(item) do if is_valid?(num), do: num, else: -1 end


小智 6

Bitwalker的回答很好地回答了你的问题; 但是,你对所有这些-1做了什么?如果您稍后要过滤掉它们,请考虑以下事项:

for i <- items, num <- get_nums_from(item), is_valid?(num), do: num
Run Code Online (Sandbox Code Playgroud)

在可执行的术语中看起来像

iex(2)> for i <- [[1,2,3],[4,5,6],[7,8,9]], j <- i, rem(j, 2) == 0, do: j
[2, 4, 6, 8]
Run Code Online (Sandbox Code Playgroud)

或者看看Enum.filter/2.


Paw*_*rok 5

循环的自由翻译将类似于:

Enum.flat_map(items, fn (item) ->
  Enum.map(get_nums_from(item), fn (num) ->
    if is_valid?(num), do: num, else: -1
  end)
end)
Run Code Online (Sandbox Code Playgroud)

如果你还想保留迭代的懒惰特性(我认为.net版本会有),你需要使用Stream来创建一个懒惰的序列:

Stream.flat_map(items, fn (item) ->
  Stream.map(get_nums_from(item), fn (num) ->
    if is_valid?(num), do: num, else: -1
  end)
end)
Run Code Online (Sandbox Code Playgroud)