ErlangOTP学习-Erlang基础学习

需要先学习一下Erlang基础。

从最简单的数据类型开始。

7> 1.23456+1.0.  
2.23456
8> 1.234567+1.0. 
2.234567
9> 1.2345678+1.0.
2.2345677999999998
10> 

从上面浮点数的加法可以看到,erlang中,浮点数据在小数点后7位,相加就不能保证精确度了。

--------------------

erlnag中为什么没有字符串呢?原因是,erlang语言是由电信公司研发的。在电信应用程序中并不依赖字符串操作。所以字符串也就从来没有成为过erlang中的一个数据类型。在erlang中字符串类型是由整数列表来表示的。

31> [66,67,68].
"BCD"
32> 

上面的三个数的列表表示的是字符串BCD。 

------------------------------------------

数学运算符

除法:div

取余:rem

----------------------------------------

原子:atom,由小写字母开头,用来表示文字常量。和java中的static final是一样的作用。

---------------------------

那么原子和字符串有什么区别呢?

唯一可以用于原子的操作是比较操作,而我们可以使用很多方式来操作字符串。例如把字符串“ni hao”分拆成["ni","hao"],而原子就不行。

原子和字符串之间还有一个比较大的区别就是效率。字符串存储的时候是与字符串的长度成正比的。而原子则只需要几个字节用作索引,与原子的大小无关。当一个程序需要比较字符串的时候,需要遍历字符串中的每个字符。而原子的比较,只需要比较他们的内部标识符(对我们不可见)即可。

 ----------------------------

erlang中,变量必须都以大写字母开头。而且,变量只能赋值一次!这就是传说中的单次赋值。

---------------------------------

erlang的一个优点是,它不需要明确的分配和释放内存。用来存储复杂数据结构的内存由系统按需自动的分配和释放。

------------------------------------

模式匹配:注意,这里说的模式匹配和“正则表达式”没有任何关系

erlang中,模式匹配用于以下几种情况:

1、变量赋值。

2、控制程序执行流程。

3、从符合数据类型中提取值。

比如,S=1+2.,就是一个模式匹配。然而,当一个变量已经被绑定过值了,那么模式匹配就变成了比较变量当前的值与将要匹配的表达式是否相等了。

比如下面的例子:

9> S=1+2.
3
10> S
10> .
3
11> S=2+3.
** exception error: no match of right hand side value 5
12> 

由于S已经赋值过了,所以当执行S=2+3的时候,就会比较2+3与S是否相等。

---------------

当一个模式匹配执行的时候会发生什么呢?

1、当模式匹配成功的时候,原来未被绑定值的变量就变成了绑定值的变量了。

2、当模式匹配失败的时候,结果是没有绑定值。

------------------------------------------

Erlang中所有函数变量调用都是按值调用的。在 函数被求值之前,所有的函数调用参数都已经被求值了。在Erlang中不存在引用调用的概念。Erlang中所有变量都是局部的。全局变量是不存在的。这不仅使erlang程序更加容易调试,也减少了出错的风险,避免了不良的变成习惯。

Erlang中变量的另外一个特点就是,我们不需要声明他们,只需要使用他们即可(这是因为erlang中变量是动态类型的,根据变量上进行的操作,在运行的时候再确定变量的类型)。当然这也是有不好的地方,看下面的例子:

9> Var=one.
one
10> D=Var*2.
** exception error: an error occurred when evaluating an arithmetic expression
     in operator  */2
        called as one * 2
11> 
这个例子中,尝试把一个原子乘以一个整数。这在编译的时候并不会出错。但是云心的时候却会报错。

----------------------------------------

Erlang中变量只能赋值一次。但是如果我们一个程序要运行很多年,哪有那么多变量名可以使用呢?

可以使用f()函数来解绑定。不过只能在终端中使用它。尝试在程序中使用它,会导致编译错误。

下面是解绑定的一个例子:

11> D.
2
12> f(D).
ok
13> D
13> .
* 1: variable 'D' is unbound
14> 

-------------------------------------

模式匹配除了上面说的变量赋值以外,还可以控制程序的流程。


---------------------------------

模式匹配还可以从复杂类型中提取值。看例子:

踀51> P={"naughty",11,"gz"}.
{"naughty",11,"gz"}
52> {Name,Age,Addr}=P.    
{"naughty",11,"gz"}
53> Name.                 
"naughty"
54> Age.                  
11
55> Addr.                 
"gz"
56> 

------------------------------

最后看一个比较特殊的例子:

25> [A,B|C]=[1,2,3,4,5,6,7].
[1,2,3,4,5,6,7]
26> A
26> .
1
27> B.
2
28> C.
[3,4,5,6,7]
29> 
上面例子中,使用[A,B|C]=[...]来给ABC三个变量赋值。其中A匹配到了1,B匹配到了2,剩下的由C匹配。

32> [A,B|C]=[1,2].          
[1,2]
33> A.
1
34> B.
2
35> C.
[]
36> 
上面的这个例子,也是用ABC去匹配变量。但是由于右侧的列表仅包含两个元素,所以C最终没有匹配到元素,C是一个空列表。看看与下面的例子有什么不同?

踀36> [A,B,C]=[1,2].
** exception error: no match of right hand side value [1,2]
37> 
上面的这一行代码[A,B,C]表明右侧列表至少有三个元素。但是实际上只包含两个。

在[A,B|C]这个例子中,C绑定到右侧列表的尾部。由于绑定完AB之后,尾部没有更多列表了,所以C就成为空列表了。

--------------------------------------------

发布了339 篇原创文章 · 获赞 66 · 访问量 236万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章