Boolean x = true;
...
x = false;
这在 erlang 中永远不会发生。 Erlang变量只能赋值一次,这也意味着你不能在erlang中做var++和var--。
您可以在函数子句的头部使用所谓的 guards 来对函数参数使用布尔过滤器。在守卫中,逗号在其他语言中的作用类似于&&,而分号的作用类似于||。
-module(my).
-compile(export_all).
guard: Y==1 && X
+----------+
| |
| |
go(X, Y) when Y==1, X ->
false;
go(_, _) ->
true.
go_test() ->
false = go(true, 1),
true = go(false, 1),
true = go(true, 20),
all_tests_passed.
在外壳中:
~/erlang_programs$ erl
Erlang/OTP 20 [erts-9.3] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:10] [hipe] [kernel-poll:false]
Eshell V9.3 (abort with ^G)
1> c(my).
my.erl:2: Warning: export_all flag enabled - all functions will be exported
{ok,my}
2> my:go_test().
all_tests_passed
3>
根据 Wotjek Surowka,go/2 可以在没有警卫的情况下更简单地编写。因为只有一种参数组合的结果是false,而所有其他参数组合都会产生true 结果,你可以这样写:
go(true, 1) ->
false;
go(_, _) ->
true.