Elixir ———神奇的管道符

Elixir崇尚简洁,Unix的一个重要哲学就是管道操作符,Elxiir也完美的试用与函数。

通常而言,程序员把功能点写成一个个精巧的函数。然后通过函数的组合嵌套实现功能。

1
2
3
4
people = DB.find_customers
orders = Orders.for_customers(people)
tax = sales_tax(orders, 2013)
filing = prepare_filing(tax)

  

这样的面包黄油(Bread-and-butter)编程。我们还可以选择这样简写:

1
filing = prepare_filing(sales_tax(Orders.for_customers(DB.find_customers), 2013))

  

上面的代码一个函数的调用使用上一个函数的结果作为参数,就像小孩子吃蔬菜一样。不仅比较难读,而且如果你想知整个过程的顺序,不得不阅读里面的内容。

Elixir有一个更好的方式:

1 filing = DB.find_customers
2             |> Orders.for_customers
3             |> sales_tax(2013)
4             |> prepare_filing

 

|> 操作符会把左边表达式的结果当成参数传入右边的函数。

第一个函数调用返回customers的列表,这个结果传给for_customers函数。for_customers调用的返回结果order,order作为第一个参数传给sales_tax。此时2013变成了第二个参数。

 

val |> f(a,b) 等价于 f(val,a,b)

1
2
3
list
|> sales_tax(2013)
|> prepare_filing

  

等价于 prepare_filing(sales_tax(list, 2013)).

 

上面的例子,每一项我都单独的写了一行,这在Elixir已经不过时了。有逼格的方式是写成一行链式的效果:

1
2
iex> (1..10) |> Enum.map(&(&1*&1)) |> Enum.filter(&(&1 < 40))
[1, 4, 9, 16, 25, 36]

 

注意:  使用&语法糖来作为函数的缩写,同时也使用了管道操作符。

我再重复一次,你总是需要在管道符号内使用圆括号调用函数。管道符的好处是让你写的代码符合规范和有条理,简短而漂亮。

例如sales-tax 的例子,你可以在纸上写下:

  • 获取顾客列表
  • 通过顾客列表生成一个订单列表
  • 计算出租车的订单价值
  • 准备出租车

从餐巾纸到代码规范,你只需要用 |>  来串联每一个函数的调用。

DB.find_customers               # 获取顾客列表  
    |> Orders.for_customers     # 通过顾客列表生成一个订单列表
    |> sales_tax(2013)          # 计算出租车的订单价值
    |> prepare_filing           # 准备出租车

编程是数据的转换,|>很好的体现了数据转换。之前Elixir管道一试就针对了一个具体问题做了实践。

 

 

posted @   孤独信徒  阅读(281)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示