第1回先从不变的变量说开来,学过其他编程语言的人都知道,变量之所以叫变量,是因为它会经常变,被修改。假设原本X  = 10,后来再执行X = 24,那么X就从10变成了24,这对于程序新手和老鸟来说,都是永恒不变的真理。但是如果你写Erlang代码还这么认为的话,那么你就错了,大错特错,还会导致编译失败。现在请把你从其他编程语言学的特性忘掉,把自己变成一张白纸,让我们回一趟小学书本,看下解方程的例子。

  知识点1:变量不可变

记得上学的时候,数学老师曾说过:“如果一个等式中有好几处X,那么所有X都是一样的”。举个例子,如下:

题目:二元一次方程,请计算X和Y分别是多少?
X + Y = 10
X - Y = 2

解:
因为X - Y = 2,所以可以得出:Y = X - 2,
将Y代入第一个方程,会变成
X + X - 2 = 10,
再精简成:
2X = 12,所以X = 12/2 = 6
Y = X - 2 = 6 - 2 = 4。

  从上面的方程可以计算得出X等于6,Y等于4,那么X还能是其他值吗?答案是肯定不行,如果你把X改成7,那么上面的二元一次方程怎么算都是错的。如果还不能理解,那么先尝试着接受新思想,旧思想有旧思想的好处,新思想有新思想的好处,旧的不去新的不来。

  实验1:变量不可被修改

Erlang/OTP 23 [erts-11.1.3] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [hipe] [dtrace]

Eshell V11.1.3  (abort with ^G)
1> X = 6.
6
2> X.
6
3> X = 7.
** exception error: no match of right hand side value 7

  X被赋值为6之后,如果再赋值为7,那么就会报错:no match,意思是X与7不能匹配,所以X = 6并不是赋值,而是进行了一次模式匹配。命令①表示X与6进行匹配,这次匹配是成功的,所以X绑定了6,所以X等于6。

  知识点2:特殊的下划线变量

  下划线变量会被编译器特殊对待,既可以用来当占位符,跳过不关心的赋值,也可以用来避免unused的编译警告。既然是可以用来忽略不必要的赋值,那么下划线变量可以一直被赋值,而不会报错。

  实验2:可以一直被赋值的下划线变量

Erlang/OTP 23 [erts-11.1.3] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [hipe] [dtrace]

Eshell V11.1.3  (abort with ^G)
1> _ = 10.
10
2> _ = 24.
24
3> _.
* 1: variable '_' is unbound

  下划线第一次被赋值为10,第二次被赋值为24,不会报错,验证了上面说的结论:可以一直被赋值。

  但是当我们要把下划线打印出来的时候,会得到一个错误信息,意思是下划线没有被绑定,所以证明了下划线只是忽略了一次赋值(匹配)。

  在Erlang编程中,一切皆是模式匹配,无处不在,几乎每一行代码都会应用模式匹配,以后的每一回会对不同的数据类型进行模式匹配的实践。

  下一回将介绍模块(Module)的使用,且听下回分解。

  Author:snowcicada

  URL:https://www.cnblogs.com/snowcicada/p/14164471.html

最新文章

  1. [随记]Eval的连接方法
  2. activiti工作流的web流程设计器整合视频教程
  3. [javascript svg fill stroke stroke-width circle 属性讲解] svg fill stroke stroke-width circle 属性 绘制圆形及引入方式讲解
  4. Putty SSH简单使用
  5. androd Sdk manager配置
  6. Android --时间控件的使用
  7. Ubuntu下安装配置JDK 7
  8. [slim] Slim - Faster, lightweight, a enginer for Ruby
  9. JS回车事件
  10. SQLite入门与分析(三)---内核概述(2)
  11. hadoop部署工具与配置工具
  12. PHP学习笔记九【数组二】
  13. mysql集群安装配置
  14. JAVA异常处理、常用类、反射、集合
  15. hdu_3518_Boring counting(后缀数组)
  16. ASP.NET 创建WebService——简单例子
  17. Redis主从复制详解
  18. 3.2.2 SpringMVC配置式开发
  19. shiro注解和标签
  20. Mysql数据库进阶之(分表分库,主从分离)

热门文章

  1. robot 如何定义用户关键字、变量
  2. python搭建本地共享文件服务器
  3. Java反射说得透彻一些
  4. 企业安全06-Fastjson-CNVD-2017-02833
  5. 【问题记录】— web页面调用本地程序
  6. 华为交换机eNSP删除Vlan的详细步骤
  7. 初探Lerna
  8. 第15.42节、PyQt输入部件:QFontComboBox、QLineEdit、QTextEdit、QPlainText功能详解
  9. MDX非常规百分比算法-过滤数据后的百分比
  10. Fiddle常用命令