If statement Erlang-If-Else条件

If statement Erlang-If-Else条件,if-statement,erlang,If Statement,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

尝试计算分数并将其保持在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),
ok=if
得分>1.5->
得分=1.5分;
正确->
好啊
完,,
ok=如果
得分<0.2->
得分=0.2分;
正确->
好啊
完,,
放(分数,分数),
下面的代码可以工作吗

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

 if
       Score > 1.5 -> ...
变量分数已经分配了一个值,您正在将该值与小数点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.
然后,您可以在同一模块中定义另一个函数,如下所示:

do_stuff(Score) ->
    NewScore = compute(Score),
    %Do something with NewScore here...
-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]).
如果您想使用If语句,我会这样做:

do_stuff(Score) ->
    NewScore = compute(Score),
    %Do something with NewScore here...
-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]).
-模块(my)。
-编译(全部导出)。
做某事(得分)->
新闻核心=如果
得分>1.5->1.5;
得分<0.2->0.2;
正确->分数
完,,
%在此处使用NewScore进行操作,例如:
io:格式(“~w~n”,[NewScore])。

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

另一种方法是使用并保持该范围:

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

do_stuff(Score) ->
    max(min(Score, 1.5), 0.2).
如果
得分
大于1.5,
min/2
将返回1.5,否则
得分
。然后,如果该结果小于0.2,
max/2
将返回0.2,否则返回
min/2
的结果。下面是我们的测试函数:

test_do_stuff() ->
    ScoresAndResults = [{0, 0.2},
                        {1.5, 1.5},
                        {0.2, 0.2},
                        {1.4999999, 1.4999999},
                        {1.5000001, 1.5},
                        {42, 1.5},
                        {0.19999999, 0.2},
                        {0.2000000000001, 0.2000000000001},
                        {1.2, 1.2},
                        {1, 1},
                        {-1, 0.2}],
    {Scores, Results} = lists:unzip(ScoresAndResults),
    Results = [do_stuff(Score) || Score <- Scores].