二郎+如果+布尔

ERLANG + IF + BOOLEAN

Boolean x = true;
int y = 1;
int z = 1;
if(y ==1 && x == true){
    z++;
    x = false;
}
else{
    z--;
    x = true;
}

我想在 erlang 中做这个..我该怎么做? (请注意,这是一个示例代码。我想做的是一个 if 语句和这个布尔功能中的两个条件)。 任何帮助都是 welcomed.Actually 不需要 z-- 和 z++。

您可以使用 case 语句

*此示例将始终返回包含两个元素 {Z, X} 的元组

case_statement() ->

  X  = true,
  Y  = 1,
  Z  = 1,

  case {Y, X} of
    {1, true} ->
      {Z + 1, false};
    _ ->
      {Z -1, true}
  end.

如果您需要使用精确的 'if' 语句,这里是示例

if_statement() ->

  X  = true,
  Y  = 1,
  Z  = 1,

  if
    Y =:= 1 andalso X =:= true ->
      {Z +1, false};
    true ->
      {Z -1, true}
  end.
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.

在shell中:

~/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> 

Per Wotjek Surowka,go/2 可以在没有守卫的情况下写得更简单。因为只有一种参数组合的结果是 false,而所有其他参数组合都会产生 true 结果,所以您可以这样写:

go(true, 1) ->
    false;
go(_, _) ->
    true.

如果您编写函数式语言,尤其是 Erlang,请避免考虑 if 语句,尽管 Erlang 的大小写支持。

总是想到模式匹配。