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无法更改。
答案 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.