热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

二、初识Erlang之变量

回顾+本章介绍:上一篇文章我们初步的介绍了一下erlang语言的前世今生,erlang的配置和简单erlangshell的加减算法。接下来我要仔细来讲解下面的内容,我们将会拿erlan

  回顾+本章介绍:

  上一篇文章我们初步的介绍了一下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开发时带来的好处是巨大的,难以估量的..(想想都觉得兴奋)。 这些以后我会慢慢讲到。不过工作之余,还是要多多练习才是王道。下一篇教程我们将会重点讲讲浮点数、原子、元组等一些在面向对象编程上不常见的概念及基础知识。(由于时间较忙,更新可能会不及时,不过我会尽量腾出一段时间来发布教程。)

  如果您喜欢我的文章,且文章对您有益,就给点个赞,您的支持就是对我最大的鼓励。


推荐阅读
  • 本文整理了315道Python基础题目及答案,帮助读者检验学习成果。文章介绍了学习Python的途径、Python与其他编程语言的对比、解释型和编译型编程语言的简述、Python解释器的种类和特点、位和字节的关系、以及至少5个PEP8规范。对于想要检验自己学习成果的读者,这些题目将是一个不错的选择。请注意,答案在视频中,本文不提供答案。 ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 本文介绍了基于c语言的mcs51单片机定时器计数器的应用教程,包括定时器的设置和计数方法,以及中断函数的使用。同时介绍了定时器应用的举例,包括定时器中断函数的编写和频率值的计算方法。主函数中设置了T0模式和T1计数的初值,并开启了T0和T1的中断,最后启动了CPU中断。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • C# 7.0 新特性:基于Tuple的“多”返回值方法
    本文介绍了C# 7.0中基于Tuple的“多”返回值方法的使用。通过对C# 6.0及更早版本的做法进行回顾,提出了问题:如何使一个方法可返回多个返回值。然后详细介绍了C# 7.0中使用Tuple的写法,并给出了示例代码。最后,总结了该新特性的优点。 ... [详细]
  • 本文探讨了C语言中指针的应用与价值,指针在C语言中具有灵活性和可变性,通过指针可以操作系统内存和控制外部I/O端口。文章介绍了指针变量和指针的指向变量的含义和用法,以及判断变量数据类型和指向变量或成员变量的类型的方法。还讨论了指针访问数组元素和下标法数组元素的等价关系,以及指针作为函数参数可以改变主调函数变量的值的特点。此外,文章还提到了指针在动态存储分配、链表创建和相关操作中的应用,以及类成员指针与外部变量的区分方法。通过本文的阐述,读者可以更好地理解和应用C语言中的指针。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • 如何查询zone下的表的信息
    本文介绍了如何通过TcaplusDB知识库查询zone下的表的信息。包括请求地址、GET请求参数说明、返回参数说明等内容。通过curl方法发起请求,并提供了请求示例。 ... [详细]
  • 嵌入式处理器的架构与内核发展历程
    本文主要介绍了嵌入式处理器的架构与内核发展历程,包括不同架构的指令集的变化,以及内核的流水线和结构。通过对ARM架构的分析,可以更好地理解嵌入式处理器的架构与内核的关系。 ... [详细]
  • 使用圣杯布局模式实现网站首页的内容布局
    本文介绍了使用圣杯布局模式实现网站首页的内容布局的方法,包括HTML部分代码和实例。同时还提供了公司新闻、最新产品、关于我们、联系我们等页面的布局示例。商品展示区包括了车里子和农家生态土鸡蛋等产品的价格信息。 ... [详细]
  • 2016 linux发行版排行_灵越7590 安装 linux (manjarognome)
    RT之前做了一次灵越7590黑苹果炒作业的文章,希望能够分享给更多不想折腾的人。kawauso:教你如何给灵越7590黑苹果抄作业​zhuanlan.z ... [详细]
author-avatar
sky梦幻
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有