Erlang(4):模块和函数
1.创建模块和调用函数:
模块是erlang的基本单元。
模块保存在扩展名为.erl的文件里。必须先编译才能运行,编译后的模块以.beam作为扩展名。
子句没有返回语句,则最后一条表达式的值就是返回值。
2.编译
在控制台中,使用c(geometry).可以对geometry.erl进行编译。
在当前目录生成对应的geometry.beam文件。
3.路径
c的参数,是文件名。带不带扩展名.erl都可以。是绝对路径,相对路径,都可以。
例如我的目录是e:/mywokespace/ErlangGame/geometry.erl
{ok,geometry}
只有这个了。
编译之后,调用模块是不用加这个路径了。
4.fun:基本抽象单元
定义一个函数
试了好久好久,突然发现x是小写的。在Erlang里面,x就相当于C++的'x'。是不能做变量的。
变量都是大写开头的。
5.函数可以作为参数
直接把函数名传进去就行了。
lists:map相当于for循环
6.=:=测试是否相等。
7.函数作为返回值
在模块里面加个函数
模块是erlang的基本单元。
模块保存在扩展名为.erl的文件里。必须先编译才能运行,编译后的模块以.beam作为扩展名。
子句没有返回语句,则最后一条表达式的值就是返回值。
-module(geometry). %模块声明,模块名必须与文件名相同。 -export([area/1]). %导出声明,声明可以外部使用的函数 area({rectangle, Width, Height}) -> Width*Height; %子句1 area({square, Side}) -> Side * Side.%子句2这个函数area有多个子句,子句之间用;分开。
2.编译
在控制台中,使用c(geometry).可以对geometry.erl进行编译。
在当前目录生成对应的geometry.beam文件。
17> c("ErlangGame/geometry.erl"). ErlangGame/geometry.erl:1: Warning: Non-UTF-8 character(s) detected, but no encoding declared. Encode the file in UTF-8 or add "%% coding: latin-1" at the beginning of the file. Retrying with latin-1 encoding. {ok,geometry}
3.路径
c的参数,是文件名。带不带扩展名.erl都可以。是绝对路径,相对路径,都可以。
例如我的目录是e:/mywokespace/ErlangGame/geometry.erl
c("e:/mywokespace/ErlangGame/geometry.erl").%使用绝对路径 c("ErlangGame/geometry.erl").%使用相对路径,这个时候我所在的目录是e:/mywokespace/ c(geometry).%使用相对路径、去掉双引号。因为没有.号,可以使用原子。编译的输出了警告:
ErlangGame/geometry.erl:1: Warning: Non-UTF-8 character(s) detected, but no encoding declared. Encode the file in UTF-8 or add "%% coding: latin-1" at the beginning of the file. Retrying with latin-1 encoding.这是因为我写了注释,注释是汉字,使用了UTF-8。去掉的话,就会:
{ok,geometry}
只有这个了。
编译之后,调用模块是不用加这个路径了。
4.fun:基本抽象单元
定义一个函数
1> Double = fun(x)->2*x end. #Fun<erl_eval.6.52032458> 2> Double(2). ** exception error: no function clause matching erl_eval:'-inside-an-interpreted-fun-'(2)函数定义是成功了,但是怎么调用都报错。
试了好久好久,突然发现x是小写的。在Erlang里面,x就相当于C++的'x'。是不能做变量的。
变量都是大写开头的。
3> Three = fun(X)-> 3 * X end. #Fun<erl_eval.6.52032458> 4> Three(2). 6ok。成功了。
5.函数可以作为参数
5> L = [1,2,3,4]. [1,2,3,4] 6> lists:map(Three, L). [3,6,9,12]这里调用了标准库的模块。标准库是已经编译好的,可以直接使用。
直接把函数名传进去就行了。
lists:map相当于for循环
6.=:=测试是否相等。
8> lists:filter(fun(X)->(X rem 2)=:=0 end,[1,2,3,4,5,6,7,8]). [2,4,6,8]llists:filter根据条件过滤列表的元素。
7.函数作为返回值
9> Fruit = [apple, pear, orange]. %创建一个列表 [apple,pear,orange] 10> MakeTest = fun(L)->(fun(X)->lists:member(X,L) end) end.%创建一个测试函数。 #Fun<erl_eval.6.52032458> 11> IsFruit = MakeTest(Fruit).%这里不是函数声明,而是匹配了MakeTest的返回值。 #Fun<erl_eval.6.52032458> 12> IsFruit(pear).%调用函数 true 13> lists:filter(IsFruit, [dog, orange, cat, apple, bear]).%过滤 [orange,apple]MakeTest内声明了一个函数,因为是最后一个语句,所以被作为返回值。
在模块里面加个函数
-module(test). %模块声明,模块名必须与文件名相同。 -export([area/1,test/0,for/3]). %导出声明,声明可以外部使用的函数 area({rectangle, Width, Height}) -> Width*Height; %子句 area({square, Side}) -> Side * Side. test() -> 12 = area({rectangle, 3, 4}), 144 = area({square, 13}), tests_worked.
人生如戏,还是戏如人生?微信公众号:传说之路
csdn博客 http://blog.csdn.net/u012175089/article/list/2