我刚刚在Erlang的文档(here)中踩到begin...end
,但它没有提供一些有用的示例。
在StackOverflow中查看我在列表推导中找到了两个人们将begin...end
使用的案例:
但我想知道是否有更多此类用途。
任何人都可以提供另一种方案,其中begin...end
在Erlang中很有用吗?
由于
答案 0 :(得分:6)
宏,例如:
-define(M(A, B),
begin
C = foo(),
bar(A, B, C)
end).
答案 1 :(得分:6)
评估一个捕获(总是将多个表达式减少为一个的想法相同)
Res = (catch
begin
C = foo(Bar),
io:format("evaluation of C ok~n"),
D = bar(A, B, C)
end),
答案 2 :(得分:3)
正如之前的回答者所提到的,只要你需要多个表达式但只允许一个表达式,就会使用这个结构。
然而,大多数此类案件将被视为一种臭味。我只能记住一些需要单个表达式的地方:函数调用中的参数,catch
表达式,case of
,try of
和列表理解。除了列表推导之外,所有这些都不应该与begin end
构造一起使用,因为变量泄漏到外部作用域可能导致后续绑定变为匹配。
列表推导表达式是不同的,因为它被转换为具有其自己的作用域的单独函数,并且begin end
中没有引入的变量泄漏到外部作用域。
答案 3 :(得分:0)
根据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: ','