erlang的函数与流程控制【二】

本文介绍了Erlang中的case和if语句的使用方法,并详细解释了算术表达式的运算符及其优先级。通过实例展示了如何利用模式匹配进行资源分配。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1:case语句

case表达式允许在子句主体内部于多个选项中进行选择,语法如下:

case Expr of
    Pattern1 [when Guard1] -> Seq1;
    Pattern2 [when Guard2] -> Seq2;
    ...
    PatternN [when GuardN] -> SeqN
end

首先,对Expr求值,然后,Expr的值将依次与模式Pattern1、Pattern2……PatternN进行匹配,直到匹配成功。如果找到一个匹配并且(可选的)的保护式成立,则对应的调用序列将被求值。注意case保护式与函数保护式形式相同。case原语的值就是被选中的序列的值。

至少得有一个模式必须得以匹配——否则就会产生一个运行时错误并引发第??章中的错误处理机制。

举个例子,比方说我们我有个函数allocate(Resource)用于分配某种资源Resource。假设这个函数只返回{yes, Address}或no。这样,这个函数便可以放在一个case结构里:

...
case allocate(Resource) of
    {yes,Address} when Address > 0, Address =< Max ->
        Sequence 1 ... ;
    no ->
        Sequence 2 ...
end
...

在Sequence 1 ...中,变量Address已经被绑定在了allocate/1的返回结果上。

为了避免匹配错误的发生,我们常常追加一个必会匹配的模式作为case原语的最后一个分支:

case Fn of
    ...
    _ ->
        true
end


IF

if表达式的语法如下:

if
    Guard1 ->
        Sequence1 ;
    Guard2 ->
        Sequence2 ;
    ...
end

在这种情况下,保护式Guard1,...将被依次求值。如果一个保护式成立则对与之关联的序列求值。该序列的求值结果便是if结构的结果。if保护式与函数保护式形式相同。与case相同,一个保护式都不成立的话将引发一个错误。如果需要,可以增加保护式断言true作为垃圾箱:

if
    ...
    true ->
        true
end


算术表达式

算术表达式由以下运算符构成:

运算符描述类型操作数类型优先级
+ X + X 单目混合1
- X - X 单目混合1
X * Y X * Y 双目混合2
X / Y X / Y (浮点除法)双目混合2
X div Y X 整除Y 双目整数2
X rem Y X 除以Y 的余数双目整数2
X band Y X Y 的位与双目整数2
X + Y X + Y 双目混合3
X - Y X - Y 双目混合3
X bor Y X Y 位或双目整数3
X bxor Y X Y 的位算数异或双目整数3
X bsl N X 算数左移N 双目整数3
X bsr N X 右移N 双目整数3

单目 运算符有一个参数,双目 运算符有两个参数。混合 意味着参数即可以是integer 也可以是float 。单目运算符的返回值与其参数类型相同。

双目混合运算符(即* - + )在参数都是integer 时返回类型为integer 的对象,在参数至少包含一个float 时返回一个float 。浮点除法运算符/ 总是返回一个float

双目整数运算符(即band div rem bor bxor bsl bsr )的参数必须是整数,其返回值也是整数。

求值顺序取决于运算符的优先级:首先计算第1优先级的运算符,然后是第2优先级,以此类推。括号内的表达式优先求值。

优先级相同的运算符从左到右进行求值。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值