unitlist |> Enum.filter(&(s in &1))
或者我可以寫
for u <- unitlist, s in u, do: u
是什麼在這兩個結構的功能區別?
unitlist |> Enum.filter(&(s in &1))
或者我可以寫
for u <- unitlist, s in u, do: u
是什麼在這兩個結構的功能區別?
對於他們是相同的,無論什麼unitlist
這個數值就是這個特定的情況下 - 他們都接受任何可枚舉和運行上的每個項目的s in &1
檢查,並返回一個新的列表,這些返回truthy值。
for
有比Enum.filter
可以獨自完成的更多功能:您可以遍歷多個枚舉並生成一個平坦的結果列表。你可以有對<-
和for
左一個容易犯錯的模式會悄悄地跳過這些項目,而不是拋出一個錯誤。您可以修改檢查後返回的值。下面的代碼片段說明了這一切:
iex(1)> for a <- 1..3, b = 2 <- 1..3, a > 1, do: {a, b}
[{2, 2}, {3, 2}]
一個for
可脫至Enum.map
,if
和Enum.flat_map
的組合。以上是與此相同:
Enum.flat_map(1..3, fn a ->
Enum.flat_map(1..3, fn
b = 2 ->
if(a > 1, do: [{a, b}], else: [])
_ ->
[]
end)
end)
|> IO.inspect
像@Dogbert在his answer說:在你的榜樣,它在做同樣的事情。而for
理解可以做的比過濾了很多。它可以很容易地更換了很多Enum
功能。
好了,因此功能更加強大 - 那爲什麼Enum.filter存在?你想什麼時候使用它來代替?
想象一下,問道:「爲什麼駕駛你的雙門轎跑車開車時,你可以駕駛房車? :)
一些的Enum
功能的優點是它們更簡單,與管道更好的鏈接,並且可以描述你的意圖更好。
例如
[1, 2, 3, 4]
|> Enum.filter(&(&1 > 2))
|> Enum.map(&to_string/1)
|> Enum.join()
# "34"
好,所以'for'功能更強大 - 那麼爲什麼Enum.filter存在?你什麼時候想用這個代替'for'? – chx
'Enum.filter'比'for'短,當你只是想從篩選基於謂詞列表的一些項目。與'for'不同,它也可以很容易地在管道中使用。 – Dogbert
FWIW,'for'理解力[transpiled成'reduce'](https://github.com/elixir-lang/elixir/blob/master/lib/elixir/src/elixir_erl_for.erl#L125),不嵌套flatmaps 。 – mudasobwa