首页 > 解决方案 > Erlang - 如果其他条件

问题描述

尝试计算分数并将其保持在 0.2 到 1.5 之间。下面的代码会起作用吗?我不希望它返回,但继续前进。

     ok = if
       Score > 1.5 ->
         Score = 1.5;
       true ->
         ok
     end,
      ok =   if
             Score < 0.2 ->
                 Score = 0.2;
             true ->
                 ok
         end,
    put(score, Score),

标签: if-statementerlang

解决方案


下面的代码会起作用吗?

不可以。在 erlang 中,你只能给一个变量赋值一次。这是你应该学习的第一件事。在本声明中:

 if
       Score > 1.5 -> ...

变量 Score 已经被分配了一个值,您将其与十进制 1.5 进行比较。假设 Score 的值为 2.0,因此该特定 if 子句的主体执行:

 Score = 1.5;

这相当于写:

 2.0 = 1.5;

这将导致模式匹配错误:

  • 异常错误:右侧值 1.5 不匹配。

在erlang中,一旦你给一个变量赋值,之后对该变量的任何后续赋值都将被视为模式匹配,即等号右边的值将与等号左边的值进行模式匹配符号。


在 erlang 中,您通常使用多个函数子句来模式匹配不同的值:

-module(my).
-compile(export_all).

compute(Score) when Score > 1.5 ->
    1.5;
compute(Score) when Score < 0.2 ->
    0.2;
compute(Score) ->
    Score.

在外壳中:

1> c(my).
my.erl:2: Warning: export_all flag enabled - all functions will be exported
{ok,my}

2> Score1 = my:compute(1.6).
1.5

3> Score2 = my:compute(1.5).
1.5

4> Score3 = my:compute(1.2).
1.2

5> Score4 = my:compute(0.1).
0.2

6> Score5 = my:compute(0.2). 
0.2

然后你可以像这样在同一个模块中定义另一个函数:

do_stuff(Score) ->
    NewScore = compute(Score),
    %Do something with NewScore here...

如果你想使用 if 语句,我会这样做:

-module(my).
-compile(export_all).

do_stuff(Score) ->
    NewScore = if 
                   Score > 1.5   -> 1.5;
                   Score < 0.2   -> 0.2;
                   true          -> Score
               end,
    %Do something with NewScore here, for instance:
    io:format("~w~n", [NewScore]).

为了使您的函数不超过 5-6 行,将 if 语句移到另一个函数中会有所帮助。


推荐阅读