列表推导式
Buy = [{oranges,4},{newspaper,1},{apples,10},{pears,6},{milk,3}].
1 ->[{Name,2*Number}||{Name,Number} <- Buy].
<- [{oranges,8},{newspaper,2},{apples,20},{pears,12},{milk,6}]
2 ->[{2*Number}||{Name,Number} <- Buy].
<-[{8},{2},{20},{12},{6}]
利用shell 编写第一条的时候,会把每一个商品的金额乘以2,
然后利用第二条发送的时候 发现只会返回乘以2,因此可以看出控制输出内容在于列表推导式的第一条元组
解读
从右到左的顺序,首先将Buy 放到列表推导式中,然后分值变量,通过|| 类似与运维的管道符。将数值进行处理
而在erlang中也说明了左边第一个元组可以叫做构造器(construcuor)
lib_misc.erl
-module(lib_misc).
-export( [qsort/1] ).
qsort([] ) -> [];
qsort([Pivot|T]) ->
qsort([X || X <- T, X < Pivot])
++ [Pivot] ++
qsort ([X || X <- T,X >= Pivot]).
->C = [23,6,2,9,27,400,78,45,61,82,14].
<-[23,6,2,9,27,400,78,45,61,82,14].
->L = [23,123,54,123,78,123].
<-[23,54,78,123,123,123].
解读
执行qsort的时候将C 变成头与尾,然后在向下执行 第一个表达式的意思就是将头与每个数值新型比较,每个数值 <头部的将他存储起来 , 然后 将 上下两个列表相加返回 然后在向下执行比较比他大或者等于他的
内置函数(BIF)
list_to_tuple
将列表转换成元组
time()
时分秒返回时间
归集器
odds_and_evensl(L) ->
Odds = [X || X <- L, (X rem 2) =:= 1],
Evens = [X || X <-L, (X rem 2) =:= 0],
{Odds,Evens}.
=> lib_misc:odds_and_evensl([1,2,3,4,5,6]).
<- {[1,3,5],[2,4,6]}
odds_and_evens2(L) ->
odds_and_evens_acc(L,[],[]).
odds_and_evens_acc([H|T],Odds,Evens) ->
case (H rem 2) of
1 -> odds_and_evens_acc(T,[H|Odds],Evens);
0 -> odds_and_evens_acc(T,Odds,[H|Evens])
end;
odds_and_evens_acc([],Odds,Evens) ->
{Odds,Evens}.
-> lib_misc:odds_and_evens2([1,2,3,4,5,6])
<- {[5,3,1],[6,4,2]}
解读
第二个例子有点绕,因为erlang没有像python里面的for循环,所以所有的数据就像加工一样买一层一层的剥
首先 调用了一下当前第一个函数 也就是odds_and_ecens2,然后里面执行了下面的两个函数,L值的情况下
分出头和尾,然后将两个空列表也进行了传输, 第一次case 用头除去当前的2判断是否是1或者0,
如果是1的话那么,那么继续调用这个函数,并且将刚才判断的1或者0的放入头,也就是反转了列表,继续剥
等到为空的时候则 将分好的两个列表打包成元组返回
记录与映射组(map)
其实就相当于Python的字典
可以保存到一个文件里面 其拓展名为.hrl
-record(todo,{status=reminder,who=joe,text}).
创建了一条字典,名字是todo
rr("当前创建拓展名的文件")
记录到shell里面
#todo{}
相当于创建实例吧 在Python里面
->X1 = #todo{status=urgent,who=joe,text="11"}.
<-#todo{status = urgent,who = joe,text = "11"}
->X2 = X1#todo{status=1}
<-#todo{status = 1,who = joe,text = "11"}
语法 #todo{key1=Val1, ..., keyN=ValN} 用于创建一个类型为 todo 的新纪录。所有的键都是原子,而且必须与记录定义里所用的一致。如果省略
了一个键,系统就会用记录定义里的值作为该键的默认值。
在第4行复制了一个现有的记录。语法 X1#todo{status=done} 的意思是创建一个 X1 的副本
(类型必须是 todo ),并修改字段 status 的值为 done 。请记住,这么做生成的是原始记录的一个
副本,原始记录没有变化
提取
->#todo{who=W,text=Txt} = X2.
<-#todo{status = 1,who = joe,text = "11"}
->W
<-joe
->Txt
<-11
->X2#todo.text
<- 11
在函数里面写入
clear_status(#todo{status=S,who=W}=R) ->
%% 在函数内部,S和W绑定了记录里面的字段值 R是整个记录
do_something(X) when is_record(X,todo) ->
block code.....
这个子句会在 X 是 todo 类型的记录时匹配成功。
映射组
即,没有原子作为名字的一组字典,直接就变成字典了 与上面记录不同的就是记录就跟Python一样有变量名指向这个字典
->F2 = #{b => 2, a => 1}.
<-#{a => 1,b => 2}
->F1 = F2.
<-#{a => 1,b => 2}
->F3 = F1#{c => xx}.
<-#{a => 1,b => 2,c => xx}
-> F1.
<-#{a => 1,b => 2}
提取
->Henry8 = #{class => king,born => 1491,died => 1574}.
<-#{born => 1491,class => king,died => 1574}
->#{ born := B} = Henry8.
<-#{born => 1491,class => king,died => 1574}
->B.
<-1941