erlang的函数

简介: erlang的方法申明是其引以为豪的,虽然被不用erlang的人嘲笑。 巨丑无比是吧。 erlang声称自己的函数调用使用的是Pattern Match模式匹配: function(Args) if X then Expression else if Y then Expr...

erlang的方法申明是其引以为豪的,虽然被不用erlang的人嘲笑。

巨丑无比是吧。

erlang声称自己的函数调用使用的是Pattern Match模式匹配:

function(Args)
if X then
Expression
else if Y then
Expression
else
Expression

 这是其他语言的风格,erlang把上面的一个方法拆开成好几个function声明:

function(X) ->
Expression;
function(Y) ->
Expression;
function(_) ->
Expression.

 不过注意,实际上他们是一个整体*(函数名称也是一致的),因为只有到最后采用了结束的点号,中间都用的分号。

 

比如:

greet(male, Name) ->
io:format("Hello, Mr. ~s!", [Name]);
greet(female, Name) ->
io:format("Hello, Mrs. ~s!", [Name]);
greet(_, Name) ->
io:format("Hello, ~s!", [Name]).

 再比如判断年龄是否正常的方法:

right_age(X) when X >= 16, X =< 104 ->
    true;
right_age(_) ->
    false.

 里面的逗号意思是andalso,而分号意思实际上是orelse:所以它的反函数不再使用逗号

wrong_age(X) when X < 16; X > 104 ->
    true;
wrong_age(_) ->
    false.

 这一点是尤其要注意的。

 

接下来是erlang里面的if/else。 erlang没有else 关键字。

help_me(Animal) ->
    Talk = if Animal == cat  -> "meow";
              Animal == beef -> "mooo";
              Animal == dog  -> "bark";
              Animal == tree -> "bark";
              true -> "fgdadfgna"
           end,
    {Animal, "says " ++ Talk ++ "!"}.

 把几个elseif并列起来用分号隔开就行,而else则直接写为true,因为上面的比较返回的false,这里遇见true就可以是剩下的全部情况了。

 

另外一种分支流程判断是case of:

beach(Temperature) ->
    case Temperature of
        {celsius, N} when N >= 20, N =< 45 ->
            'favorable';
        {kelvin, N} when N >= 293, N =< 318 ->
            'scientifically favorable';
        {fahrenheit, N} when N >= 68, N =< 113 ->
            'favorable in the US';
        _ ->
            'avoid beach'
    end.

 看惯了erlang诡异的语法,觉得这个是不是很容易理解了。

 

 

 

 

目录
相关文章
|
Shell Perl
erlang 小技巧总结
开一个页面总结一些erlang的使用技巧,随时添加新的技巧。
|
消息中间件 网络协议 Go
[Erlang 0123] Erlang EPMD
 epmd进程和Erlang节点进程如影随形,在Rabbitmq集群,Ejabberd集群,Couchbase集群产品文档中都会有相当多的内容讲epmd,epmd是什么呢?   epmd 是Erlang Port Mapper Daemon的缩写,全称足够明确表达它的功能了(相比之下,OTP就.
2004 0
|
编解码 计算机视觉 存储
|
网络协议 Shell Go