合规国际互联网加速 OSASE为企业客户提供高速稳定SD-WAN国际加速解决方案。 广告
## 1. 变量 ### 1.变量不变 在erlang中的变量只能被赋值一次,变量第一个字母要是大写的。 在erlang中变量是不可变的,也没有共享内存的概念,也没有锁。 ### 2.模式匹配 符号”=”是值类型匹配操作(带有赋值的意思)。(pattern matching) * * * * * ## 2.整数 一个整数 ```erlang -234 0 10 10000000 2#1010 -16#EA $a $A $\n 1> Color = 16#F09A29. 15768105 2> Pixel = <<Color:24>>. <<240,154,41>> ``` Erlang中整型数据的计算是精确的,整型变量可代表的数据长度仅受限于可用的内存。 Erlang中可表达和使用任意大的整数。当一个整数大到一个word不能容纳的时候,Erlang内部会自动把它转换成用多个word表示的bignums类型。 可以用下面3种不同的语法来表达一个整型数值。 1. 传统语法:这种写法是我们最为熟悉的,比如1112. 12375、-23427都是整数。 2. K进制整数:不以10为进制的整数可以用语法K#Digits来表示。因此我们可以写一个二 进制数2#00101010或者一个16进制数16#af6bfa23。对于大于10进制的整数,用字符abc...(或 ABC二。)来表示数值10. 11, 12等。这种语法所能表示的最高进制为36进制。 3. $语法:语法$C表示ASCII字符C的整数值,因此$a是97的简写,$1是49的简写,等等。 紧随$之后,我们还可以使用表5-1中描述的任何转义符。因此$\n就是10, $\^c是3,等等。 下面是一些整数的例子: 0 -65 2#010001110 ~8#377 16#fe34 16#FE34 36#wow (它们的值分别是0 -65 142 -255 65076 65076和423680) Base#Value符号表示基数不是10的整数 Base是一个介于2~16的整数 * * * * * ## 3. 浮点数   1. 整数除法示例: 4 div 2。 2. 求余示例: 5 rem 2。 3. "/"永远返回浮点数。 17. 368 -56. 654 1. 234E-10. E-10是一种常规的浮点表示符号,用来表示十进制小数点必须向左移动10个位置。1. 234E-10和1.234×10~10是一样的,即0.00000001234。Erlang中的浮点数的精确度 是由IEEE 754-1985标准中的64位表示法来保证的。 一个浮点数有5个部分:一个可选符号位、一个数值部分、一个小数点、一个小数部分以及 一个可选的指数部分。 下面就是一些浮点数的例子: 1.0 3.14159 -2.3e+6 23.56E-27 经过解析,浮点数在内部会以IEEE 754的64 bit格式表示。Erlang可表示的浮点数的范围是 -10 323 -10 308 * * * * * 二进制串/位串 唯一标识符(pid、端口、引用) Fun函数 =模式匹配 ## Atoms(原子) * Atoms表示不同的非数字常量值。 * 示例: Xss = 'Asss'。   * atom是否已经注册的:registered() unregister(Pid) whereis(Atom) regs(). * atom能够进行的唯一运算就是比较 * atom是可以使用.和@的,但是别给自己添乱 * atom会被记录在ERT系统表中,只需要几个字节,atom之间比较起来也很快 * atom不参与Erlang GC,所以atom不能无节制的创建,list_to_existing_atom可以一定程度上缓解创建重复atom的内存消耗 ## 元组 * 将若干个以逗号分隔的值用一对大括号括起来就形成了一个元组。 * 元组示例: Person = {person, {name, joe}, {height, 1.83}, {footsize, 42}}. * 从元组中提取数据: ```erlang Point = {point, 10, 45}. {point, X, Y} = Point.( pattern match) 此后X=10, Y=45. %%1. record类型作为参数的小技巧 -record(x,{name,zz}). -record(y,{yy,name}). -export([test1/0,test2/0]). -define(create(Type,Name),#Type{name = Name}). test1() -> ?create(x,"Noel"). % -> {x,"Noel",undefined} test2() -> ?create(y,"Noel"). % -> {y,undefined,"Noel"} ``` * Tuple是Erlang表达复杂数据结构的手段,第一个元素经常被称作Tag,Tag Massage是Erlang编程的最佳实践 * Tuple索引是从1开始的,执行一下 element(1,{a,b,c}).看看 再试一下element(0,{a,b,c})看看报什么错 * Tuple大小使用tuple_size({1,2,3,4,5}). ## 列表 * 将若干个以逗号分隔的值用一对方括号括起来,就形成了一个列表。 * 示例: ThingsToBuy = [{apple, 10}, {pear, 6}, {milk, 3}]. * 列表中的第一个元素叫做列表头,剩下的部分叫做列表尾。一般来说列表头可以是任何东西,列表尾经常是一个列表。 * 访问列表头元素是一个非常高效的操作。 * 从列表中解析元素: ```erlang ThingsToBuy1 = [{oranges, 4}, {newspaper, 1}|ThingsToBuy]. [Buy1|ThingsToBuy2] = ThingsToBuy1. %% 此后:ThingsToBuy1 = [{oranges,4},{newspaper,1},{apple,10},{pear,6},{milk,3}]. Buy1 = {oranges,4}. ThingsToBuy2 = [{newspaper,1},{apple,10},{pear,6},{milk,3}]. ``` * M++N会遍历列表M所以如果必须要使用++也要让数据量小的List在前面 * proplist对于处理key_value的list真的是非常方面 * List=[Element|List]所以你可以在shell中可以输入[1,2|3],尝试匹配一下它 [A,B,C]=[1,2|3]再试一下[P,Q]=[1,2,3] * List最后一个元素是空列表[],被称作well-formed list正则列表,[1,2|3]这种结构要避免 * --操作符是针对元素进行的 [1,2]--[3]结果是[1,2] [2,2]--[2]结果是[2],运算顺序是从右到左, [1,2,3]--[1,2]--[1].结果是[1,3] * 在Server中,总是尽力书写尾递归(tail-recursive)的函数 * 使用'++'时,left list会被拷贝,然后添加到right list的头部,因此最好把length较短的list放在左侧 ## 字符串 在erlang中没有字符串,字符串仅仅是整数列表。用双引号将一串字符括起来就是一个字符串。 ```erlang Name = "Hello". 5>I = $s. 115 8> [I-32, $u, $r, $p, $r, $i, $s, $e]. "Surprise" ``` * Erlang中String采用list实现,32位系统中,其1个字符用8个字节的空间(4个保存value, 4个保存指针)。因此string速度较慢,空间占用较大 ## map ```erlang #{a => 1}. #{a := A} = #{a => 1}. ```