erlang 中带下划线变量的使用

在erlang里'_'是一个特殊的变量(其实erlang里不应该叫“变”量,照顾习惯,姑且这么叫吧),它可以代替任何东西,在match的时候非常有用,例如:

Erlang代码  收藏代码
  1. {A, _, [B|_], {B}} = {abc, 23, [22, 23], {22}}  

 这样,就是把_当作一个占位符,表示,match的时候这里有一个值,但是我不关心他是什么

 

在erlang里,使用下划线'_'开头的变量名是有特殊含义的,除了当作普通的变量使用(binding,match,compute,compare,etc)以外,还是一个特殊的标记,告诉编译器,这些变量是被忽略的,声明了没有使用/绑定也没关系(否则,默认情况下编译会报警的)

 

在使用下划线开头的变量来标记可以忽略的变量是一个不错的主义,比如:

Erlang代码  收藏代码
  1. {Name,_Age}={"Argan",30}  

 这里的_Age其实是我不关心的,因此使用一个_开头的变量来做match,在阅读代码的时候,虽然其他的代码里不会用到_Age,但是一下就能看出来,这个数据结构,除了Name以外,还有一个值是Age,非常明确的表达

 

不过,因为单一个'_'可以match任意的值,而且match出来的值是无法使用的,因此在表达式里多次使用是没关系的,例如第一个例子,但是,如果第一个例子修改成:

Erlang代码  收藏代码
  1. {A, _int, [B|_int], {B}} = {abc, 23, [22, 23], {22}}  

 就会出错了,本意是想表达的更清楚,_int的地方是一个int值,但是这里有一个陷阱,[Head|Tail]这样的match,出来的结果的Tail是一个list,因此,上述表达式里第一个_int的地方是一个int 23,第二个_int的地方实际上是一个list [23],因此上述表达式match会失败。

 

留此记录。

posted @ 2015-01-07 11:55  die  阅读(1163)  评论(0编辑  收藏  举报