回顾+本章介绍:
上一篇文章我们初步的介绍了一下erlang语言的前世今生,erlang的配置和简单erlang shell 的加减算法。接下来我要仔细来讲解下面的内容,我们将会拿erlang与面向对象编程语言(java和C#)的对比来学习,如此做两点好处,一来是我们以对比两种语言(相同点或者不同点)方式学习函数式编程语言可大大提高我们学习和理解能力;二来可以通过对比它们底层处理方式来提高我们对于计算机底层和深度的了解。这样做的话,坏处就是只能是拥有编程经验的人来读这些文章。如果您没有相关的编程经验,就得靠自己多用功努力学习了.我说过,我也是才接触erlang,所以我们大家有问题可以一起探讨,定知无不尽言无不答,我有说的不对的地方,高手们也多多指点。大家有不明白的地方可以加我QQ,我们可以私下交流。QQ:894624313。
好了,接下我们开始本章要着重介绍一下“erlang变量”方面的知识。
一、变量不变?
说到变量我就不得不对比一下在erlang语言中变量和在其他大部分面向对象编程语言中变量的区别。提到这我给大家举个例子,相信大
家初次接触编程的时候都有过类似的经历。在我们上高中的时候,经常遇到一些这样的数学题,X+Y=10,X-Y=2,于是我们就会推理出来,X=6 ,Y=4,我们之所以能推理出来,那是因为我们都知道,在两个计算式中的X的值是指同一个值,两个Y的值也是同一个值,但是在我们大学编程第一堂课时,老师告诉我们X=X+1时,我们就懵了...我去,X=X+1?这啥玩儿?编程就是这么乱七八糟... X不再是一个值,就好比一间房子,一个水桶...于是我们慢慢的形成了一种习惯性的思维,X就是个容器而已,但是在我们erlang当中,X又重新回归到高中时的概念!它还是一个容器,但它里面装的东西固定住了,不在变化,就好比X是一间房子,它只能容下房间的主人居住。其他人一律不让住,这么说应该明白了吧!
在C#当中,我们可能会写道:int X=0 , X=X+1 .那么Console.Write(X)时输出的时候X值为1,但是在erlang中,我们一旦为X赋值
了,那么这个X值终身不再改变!
举个例子,我们打开erlang shell(ctrl+R ->cmd->erl)
我们输入
1> X=1.
1
2> X=2.
** exception error: no match of right hand side value 2
3>
我们为X赋值,这时候X的值为1,那么接下来我们为X赋值为2,系统为为我们抛出一个错误。所以说X的值一旦经过赋值,就不能改变,大家一定回想,为什么要这么设计呢?这么设计的好处是什么呢,一会儿我会给大家粗略的介绍一下这样做的好处。哦,对了,细心的同学可能会发现我们X在erlang shell中总是大写的。这里我要着重提示一下,在使用 erlang所有的变量必须以大写字母开头,这个不要问我,我也知道为什么!(少给自己挖井,暂时先记住,等以后玩深自己去探索原因)!我们再来想一下,此处X是不是这个变量呢?我们可以称呼或理解为变量,但是和区分它和java,C#中的变量。其次这个“=”,是不是这个赋值操作呢?如果是赋值操作,我们第二次赋值为嘛不成功呢?
在erlang中一个变量如果已经被赋值了,那么这个变量就称之为绑定变量,反之,如果没有被赋值,这个变量就被称之为自由变量 。在一开始的时候,变量都是自由变量,但是当erlang执行到X=1.时,X就变成了绑定变量,一旦成为绑定变量了,那么X的值就永久性不能改变了。如果你像使用,则重新声明变量X1=X+1. X看上去也确实是个变量,只不过它 只能被赋值一次。这与传统的编程语言的变量类似。其实我们怎么理解都行,能学会才是真理,关于这个等号“=”,它也是类似于传统语言编程中的功能一样,起到一个赋值的作用。但是就其在erlang中的本质而言,“=”的概念 就不再是赋值的意思了,我给大家简单的说一下,这是erlang的一种设计概念!“=”在此处充当的是“模式匹配运算符”,听到这有些懵了吧,这个概念听上去好深奥哦..。其实也没有那么深奥,在erlang中,=表示的是模式匹配。 Lhs=Rhs,实际上过程是,对右端(Rhs)进行求值,然后将结果与左端(Lhs)进行模式匹配。我举个通俗点的例子:前面我们也说了,X只能被赋值一次,那么当我们进行X=First操作的时候,erlang执行时的流程就是,X 是个自 由变量,把 First赋值给X,那么这时erlang就会紧遵X=First的指令,之后我们又为X赋值了,X=Second ,这时erlang就会拿着First 与Second的进行对比,看是否匹配相等,如果相等,则成立,否则会抛出异常!
我们举个例子说明一下:1> X=2+4.
6
2> X=6.
6
3> X=10.
** exception error: no match of right hand side value 10
4>
当我们为X赋值为2+4时,X由自由变量变成了绑定变量 X=6,于是在后面我们又为X赋值为6,则erlang会拿着(2+4)的结果与6进行 对比,结果相同,则允许执行,否则,就会出现类似第三条指令似的报错。
二、变量为何不变
文章写道这里,基本上算是将erlang的变量描述清了。接下来我们简要分析一下为什么这种单一的赋值更有益于编写质量跟高的代码!erlang里面的变量仅仅表示对一个值得引用。就具体实现上而言,一个绑定变量就是一个指针,这个指针指向存放那个值得区域。而那个值永远无法改变。这一点在原理上和Java 、C都差不多,唯一的区别就是erlang里面的绑定变量值永远不会改变.
1> X=11.
11
2> Y=X*X+12.
133
3> 我写了个简单的算式。首先X的值赋值为11 ,然后计算出X*X+12的值,赋值给Y。如果在这种情况下,X的值改变了,如:X=10,那么Y的 值会怎么样。当我们反过来查看程序的时候,发现X*X+12的值居然不等于Y的值。那么Y的值就是不正确的。如果真要允许改变,那么以后在 程序中出现大量的这种情况,先不说程序能不能执行,我们还不得崩溃的要死。所以这样单一赋值的好处写起来简单,一旦程序出错,我们能尽快的找到赋值的正确与否。而不是像java一样,去查看为变量赋值的每个 地方,然后才能找出错误。用专业术语来说就是,我们把可修改的内存区域称之为可变状态,而erlang是个函数式编程语言,不存在可变状 态。后面我会讲到关于多核CPU程序编写,erlang没有可变状态,也没有共享内存,更不用加锁。而这一切都有利于并行化程序开发。那么在java和C 中,在编写多核CPU程序时,我们就不得不应对,共享内存带来的问题。要不想破坏共享内存在其访问时就得加锁,而在 加锁的同时还要保证操纵共享内存时不会崩溃。所以在erlang进行多核CPU开发时带来的好处是巨大的,难以估量的..(想想都觉得兴奋)。 这些以后我会慢慢讲到。不过工作之余,还是要多多练习才是王道。下一篇教程我们将会重点讲讲浮点数、原子、元组等一些在面向对象编程上不常见的概念及基础知识。(由于时间较忙,更新可能会不及时,不过我会尽量腾出一段时间来发布教程。)
如果您喜欢我的文章,且文章对您有益,就给点个赞,您的支持就是对我最大的鼓励。