什么是开始...结束于Erlang用于?

时间:2013-11-21 15:39:17

标签: erlang expression block

我刚刚在Erlang的文档(here)中踩到begin...end,但它没有提供一些有用的示例。

在StackOverflow中查看我在列表推导中找到了两个人们将begin...end使用的案例:

但我想知道是否有更多此类用途。

任何人都可以提供另一种方案,其中begin...end在Erlang中很有用吗?

由于

4 个答案:

答案 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 oftry 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: ','