Elixir崇尚簡潔,Unix的一個(gè)重要哲學(xué)就是管道操作符,Elxiir也完美的試用與函數(shù)。
通常而言,程序員把功能點(diǎn)寫成一個(gè)個(gè)精巧的函數(shù)。然后通過函數(shù)的組合嵌套實(shí)現(xiàn)功能。
people = DB.find_customers
orders = Orders.for_customers(people)
tax = sales_tax(orders, 2013)
filing = prepare_filing(tax)
這樣的面包黃油(Bread-and-butter)編程。我們還可以選擇這樣簡寫:
filing = prepare_filing(sales_tax(Orders.for_customers(DB.find_customers), 2013))
上面的代碼一個(gè)函數(shù)的調(diào)用使用上一個(gè)函數(shù)的結(jié)果作為參數(shù),就像小孩子吃蔬菜一樣。不僅比較難讀,而且如果你想知整個(gè)過程的順序,不得不閱讀里面的內(nèi)容。
Elixir有一個(gè)更好的方式:
filing = DB.find_customers
|> Orders.for_customers
|> sales_tax(2013)
|> prepare_filing
|>
操作符會(huì)把左邊表達(dá)式的結(jié)果當(dāng)成參數(shù)傳入右邊的函數(shù)。第一個(gè)函數(shù)調(diào)用返回customers的列表,這個(gè)結(jié)果傳給for_customers函數(shù)。for_customers調(diào)用的返回結(jié)果order,order作為第一個(gè)參數(shù)傳給sales_tax。此時(shí)2013變成了第二個(gè)參數(shù)。
val |> f(a,b)
等價(jià)于 f(val,a,b)
list
|> sales_tax(2013)
|> prepare_filing
等價(jià)于 prepare_filing(sales_tax(list, 2013))
.
上面的例子,每一項(xiàng)我都單獨(dú)的寫了一行,這在Elixir已經(jīng)不過時(shí)了。有逼格的方式是寫成一行鏈?zhǔn)降男Ч?/p>
iex> (1..10) |> Enum.map(&(&1*&1)) |> Enum.filter(&(&1 < 40))
[1, 4, 9, 16, 25, 36]
注意我使用&
語法糖來作為函數(shù)的縮寫,同時(shí)也使用了管道操作符。
我再重復(fù)一次,你總是需要在管道符號(hào)內(nèi)使用圓括號(hào)調(diào)用函數(shù)。管道符的好處是讓你寫的代碼符合規(guī)范和有條理,簡短而漂亮。例如sales-tax 的例子,你可以在紙上寫下:
- 獲取顧客列表
- 通過顧客列表生成一個(gè)訂單列表
- 計(jì)算出租車的訂單價(jià)值
- 準(zhǔn)備出租車
從餐巾紙到代碼規(guī)范,你只需要用|>來串聯(lián)每一個(gè)函數(shù)的調(diào)用。
DB.find_customers # 獲取顧客列表
|> Orders.for_customers # 通過顧客列表生成一個(gè)訂單列表
|> sales_tax(2013) # 計(jì)算出租車的訂單價(jià)值
|> prepare_filing # 準(zhǔn)備出租車
編程是數(shù)據(jù)的轉(zhuǎn)換,|>很好的體現(xiàn)了數(shù)據(jù)轉(zhuǎn)換。之前Elixir管道一試就針對(duì)了一個(gè)具體問題做了實(shí)踐。