【问题标题】:ERLANG + IF + BOOLEANERLANG + IF + 布尔值
【发布时间】:2019-02-07 07:56:29
【问题描述】:
Boolean x = true;
int y = 1;
int z = 1;
if(y ==1 && x == true){
    z++;
    x = false;
}
else{
    z--;
    x = true;
}

我想在 erlang 中执行此操作。我该如何执行此操作? (请注意,这是一个示例代码。我想要做的是一个 if 语句中的两个条件和这个布尔功能)。 欢迎任何帮助。实际上不需要 z-- & z++。

【问题讨论】:

  • 在计算机编程中,您永远不需要检查布尔变量与布尔值的相等性。换句话说,if X == true 产生与if X 相同的结果,并且后者更高效,因为不需要执行两个值之间的比较。

标签: if-statement erlang boolean


【解决方案1】:

你可以使用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.

【讨论】:

    【解决方案2】:

    如果您编写函数式语言,尤其是 Erlang,请避免考虑 if 语句,尽管 Erlang 案例支持这一点。

    始终考虑模式匹配。

    【讨论】:

      【解决方案3】:
      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.
      

      【讨论】:

      • 为什么是go(X, Y) when Y==1, X -> 而不是go(true, 1) ->
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-01
      • 2016-03-18
      • 2015-12-21
      • 2021-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多