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
end,
put(score, Score),
解决方案
下面的代码会起作用吗?
不可以。在 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 语句移到另一个函数中会有所帮助。
推荐阅读
- jquery - Shopify - 使用 jQuery 修改变体下拉名称
- python - 大型数据集的 hnswlib 参数?
- linux - 如何从 dart 中的文件执行字符串插值
- python - `responses` 和 `requests` 重试处理
- node.js - pm 2 log 方言需要明确提供为 v4.0.0
- sql - 我可以将函数用作列的数据吗?
- xamarin.forms - android sdk 的 Xamarin.forms UI 测试问题
- flutter - 按钮在颤动中占据整个屏幕
- sql - BigQuery UNNEST 导致列名重复
- if-statement - 价值无故增加