2017-09-13 43 views
3

我可以寫列表理解VS Enum.filter

unitlist |> Enum.filter(&(s in &1)) 

或者我可以寫

for u <- unitlist, s in u, do: u 

是什麼在這兩個結構的功能區別?

回答

2

對於他們是相同的,無論什麼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.mapifEnum.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 
+0

好,所以'for'功能更強大 - 那麼爲什麼Enum.filter存在?你什麼時候想用這個代替'for'? – chx

+0

'Enum.filter'比'for'短,當你只是想從篩選基於謂詞列表的一些項目。與'for'不同,它也可以很容易地在管道中使用。 – Dogbert

+0

FWIW,'for'理解力[transpiled成'reduce'](https://github.com/elixir-lang/elixir/blob/master/lib/elixir/src/elixir_erl_for.erl#L125),不嵌套flatmaps 。 – mudasobwa

1

@Dogberthis answer說:在你的榜樣,它在做同樣的事情。而for理解可以做的比過濾了很多。它可以很容易地更換了很多Enum功能。

好了,因此功能更加強大 - 那爲什麼Enum.filter存在?你想什麼時候使用它來代替?

想象一下,問道:「爲什麼駕駛你的雙門轎跑車開車時,你可以駕駛房車? :)

一些的Enum功能的優點是它們更簡單,與管道更好的鏈接,並且可以描述你的意圖更好。

例如

[1, 2, 3, 4] 
|> Enum.filter(&(&1 > 2)) 
|> Enum.map(&to_string/1) 
|> Enum.join() 

# "34"