If statement Erlang-If-Else条件
尝试计算分数并将其保持在0.2到1.5之间。 下面的代码可以工作吗?我不想让它回来,但要继续下去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
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中,通常使用多个函数子句对不同的值进行模式匹配:
-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].