从ERLANG中的else返回值

时间:2018-08-14 11:02:39

标签: erlang

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时,它给出了
变量'Tuple2'在'if'中不安全。
当我在'if'上方使用它时,Tuple2无法更改。

1 个答案:

答案 0 :(得分:4)

在您的代码中,前两种情况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从该案例表达式“返回”(案例表达式的求值为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.