【问题标题】:Returning value from if else in ERLANG从 ERLANG 中的 if else 返回值
【发布时间】:2018-08-14 20:10:16
【问题描述】:
parse(Tuples,Str,Block) ->
  if Block =:= 1 ->
        Str1=string:substr(Str,1,1),
        Str2=string:substr(Str,2,4),
        Tuple2=Tuples++[{a,Str1},{b,Str2}];
     Block =:= 2 ->
        Str3=string:substr(Str,1,1),
        Str4=string:substr(Str,2,3),
        Tuple2=Tuples++[{c,Str3},{d,Str4};
     true-> ok
  end.

我是 erlang 的新手。有没有办法从这个函数返回 tuple2 值?如果不是,解决方法是什么? 当我尝试在结束后返回 Tuple2 时,它给出了
'if' 中的变量 'Tuple2' 不安全。
当我在“如果”上方使用它时,Tuple2 无法更改。

【问题讨论】:

    标签: erlang


    【解决方案1】:

    在您的代码中,Tuple 在前两种情况下被“返回”。请记住,在 Erlang 中,最后一个表达式总是用作返回值。您收到警告的原因是 Tuple2 在所有分支中都没有赋值。例如,如果Block 是 3 会怎样? Tuple2 不会被定义。

    让我们用更惯用的方式重写它,以便更好地查看返回的内容:

    parse(Tuples,Str,Block) ->
      case Block of
        1 ->   
          Str1=string:substr(Str,1,1),
          Str2=string:substr(Str,2,4),
          Tuple2=Tuples++[{a,Str1},{b,Str2}];
        2 ->
          Str3=string:substr(Str,1,1),
          Str4=string:substr(Str,2,3),
          Tuple2=Tuples++[{c,Str3},{d,Str4};
        _ ->
          ok
      end.
    

    case 表达式的每个分支中的最后一个表达式将被“返回”。 如果您没有看到这一点,请考虑以下事项:

    1> case 1 of
    1>   1 -> ok;
    1>   2 -> nok
    1> end.
    ok
    

    ok 从那个 case 表达式“返回”(case 表达式的计算结果为 ok)。

    让我们把原来的代码改写成更惯用的代码:

    parse(Tuples, Str, 1) ->
      Str1=string:substr(Str,1,1),
      Str2=string:substr(Str,2,4),
      Tuple2=Tuples++[{a,Str1},{b,Str2}];
    parse(Tuples, Str, 2) ->
      Str3=string:substr(Str,1,1),
      Str4=string:substr(Str,2,3),
      Tuple2=Tuples++[{c,Str3},{d,Str4};
    parse(_, _, _) ->
      ok.
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-07-12
      • 2016-03-18
      • 2011-05-18
      • 2021-08-31
      • 1970-01-01
      • 2016-07-23
      • 1970-01-01
      相关资源
      最近更新 更多