我只是踩了一脚 begin...end
在Erlang的文档中(这里),但它没有给出一些如何有用的例子。
在StackOverflow中查看我发现了两个人们将要使用的案例 begin...end
,在列表理解中:
但我想知道是否有更多此类用途。
任何人都可以提供另一种方案 begin...end
在Erlang中有用吗?
谢谢
我只是踩了一脚 begin...end
在Erlang的文档中(这里),但它没有给出一些如何有用的例子。
在StackOverflow中查看我发现了两个人们将要使用的案例 begin...end
,在列表理解中:
但我想知道是否有更多此类用途。
任何人都可以提供另一种方案 begin...end
在Erlang中有用吗?
谢谢
宏,例如:
-define(M(A, B),
begin
C = foo(),
bar(A, B, C)
end).
评估一个catch(总是同一个想法让多个表达式减少到一个)
Res = (catch
begin
C = foo(Bar),
io:format("evaluation of C ok~n"),
D = bar(A, B, C)
end),
正如之前的回答者所提到的,只要你需要多个表达式但只允许一个表达式,就会使用这个结构。
但是,大多数此类案件将被视为一种臭味。我只能记住一些需要单个表达式的地方:函数调用中的参数, catch
表达, case of
, try of
列表理解。除了列表理解之外,所有这些都不应该使用 begin end
构造因为变量泄漏到外部范围可能导致后续绑定变为匹配。
列表推导表达式是不同的,因为它被转换为具有自己的范围的单独函数,并且没有引入变量 begin end
泄漏到外部范围。
根据erlang文档,它是块表达式,它计算每个表达式但只返回最后一个表达式。
请参阅此示例(不使用块表达式):
A = 1,
case A + 1 of
3 ->
ok;
_->
nop
end.
% returns ok
现在,您可以使用块表达式在case参数中定义A:
case begin A = 1, A + 1 end of
3 ->
ok;
_->
nop
end.
%returns ok
评估A = 1,然后返回A + 1的结果。
现在我们知道这不起作用:
case A = 1, A + 1 of
3 ->
ok;
_->
nop
end.
% returns syntax error before: ','