Elixir - 列表推導式



列表推導式是Elixir中遍歷可列舉資料的語法糖。本章我們將使用列表推導式進行迭代和生成。

基礎

在可列舉資料章節中,我們學習了Enum模組中的map函式。

Enum.map(1..3, &(&1 * 2))

在這個例子中,我們將一個函式作為第二個引數傳入。範圍內的每個元素都將傳遞到該函式中,然後返回一個包含新值的新列表。

對映、過濾和轉換在Elixir中非常常見的操作,因此與之前的示例相比,有一種略微不同的方法可以達到相同的結果:

for n <- 1..3, do: n * 2

執行上述程式碼後,將產生以下結果:

[2, 4, 6]

第二個例子是一個列表推導式,正如你可能看到的,它只是你也可以使用`Enum.map`函式實現的功能的語法糖。但是,就效能而言,使用列表推導式與使用Enum模組中的函式相比,並沒有實際好處。

列表推導式不限於列表,也可以用於所有可列舉資料。

過濾

你可以將過濾器視為列表推導式的一種保護機制。當過濾後的值返回`false`或`nil`時,它將從最終列表中排除。讓我們遍歷一個範圍,只關注偶數。我們將使用Integer模組中的`is_even`函式來檢查一個值是偶數還是奇數。

import Integer
IO.puts(for x <- 1..10, is_even(x), do: x)

執行上述程式碼後,將產生以下結果:

[2, 4, 6, 8, 10]

我們也可以在同一個列表推導式中使用多個過濾器。用逗號分隔,在`is_even`過濾器之後新增另一個你想要的過濾器。

:into選項

在上面的例子中,所有列表推導式的結果都返回列表。但是,透過將`:into`選項傳遞到列表推導式,可以將結果插入到不同的資料結構中。

例如,可以使用`:into`選項和一個位元串生成器輕鬆刪除字串中的所有空格:

IO.puts(for <<c <- " hello world ">>, c != ?\s, into: "", do: <<c>>)

執行上述程式碼後,將產生以下結果:

helloworld

上面的程式碼使用`c != ?\s`過濾器刪除字串中的所有空格,然後使用`:into`選項將所有返回的字元放入一個字串中。

廣告
© . All rights reserved.