Elixir崇尚簡潔,Unix的一個重要哲學就是管道操作符掂恕,Elxiir也完美的試用與函數(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))
上面的代碼一個函數(shù)的調(diào)用使用上一個函數(shù)的結(jié)果作為參數(shù)店枣,就像小孩子吃蔬菜一樣速警。不僅比較難讀,而且如果你想知整個過程的順序鸯两,不得不閱讀里面的內(nèi)容闷旧。
Elixir有一個更好的方式:
filing = DB.find_customers
|> Orders.for_customers
|> sales_tax(2013)
|> prepare_filing
|>
操作符會把左邊表達式的結(jié)果當成參數(shù)傳入右邊的函數(shù)。第一個函數(shù)調(diào)用返回customers的列表甩卓,這個結(jié)果傳給for_customers函數(shù)鸠匀。for_customers調(diào)用的返回結(jié)果order,order作為第一個參數(shù)傳給sales_tax逾柿。此時2013變成了第二個參數(shù)缀棍。
val |> f(a,b)
等價于 f(val,a,b)
list
|> sales_tax(2013)
|> prepare_filing
等價于 prepare_filing(sales_tax(list, 2013))
.
上面的例子宅此,每一項我都單獨的寫了一行,這在Elixir已經(jīng)不過時了爬范。有逼格的方式是寫成一行鏈式的效果:
iex> (1..10) |> Enum.map(&(&1*&1)) |> Enum.filter(&(&1 < 40))
[1, 4, 9, 16, 25, 36]
注意我使用&
語法糖來作為函數(shù)的縮寫父腕,同時也使用了管道操作符。
我再重復一次青瀑,你總是需要在管道符號內(nèi)使用圓括號調(diào)用函數(shù)璧亮。管道符的好處是讓你寫的代碼符合規(guī)范和有條理,簡短而漂亮斥难。例如sales-tax 的例子枝嘶,你可以在紙上寫下:
- 獲取顧客列表
- 通過顧客列表生成一個訂單列表
- 計算出租車的訂單價值
- 準備出租車
從餐巾紙到代碼規(guī)范,你只需要用|>來串聯(lián)每一個函數(shù)的調(diào)用哑诊。
DB.find_customers # 獲取顧客列表
|> Orders.for_customers # 通過顧客列表生成一個訂單列表
|> sales_tax(2013) # 計算出租車的訂單價值
|> prepare_filing # 準備出租車
編程是數(shù)據(jù)的轉(zhuǎn)換群扶,|>很好的體現(xiàn)了數(shù)據(jù)轉(zhuǎn)換。之前Elixir管道一試就針對了一個具體問題做了實踐镀裤。