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

Mon*_*Kin 12 erlang expression block

我只是begin...end在Erlang的文档(这里)中踩了一脚,但它没有给出一些如何有用的例子.

在StackOverflow中查看我发现了两个人们将要使用的情况begin...end,两者都在列表推导中:

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

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

谢谢

P_A*_*P_A 7

宏,例如:

-define(M(A, B),
    begin
        C = foo(),
        bar(A, B, C)
    end).
Run Code Online (Sandbox Code Playgroud)

  • 谢谢@P_A.一些澄清,以便其他人不必测试我刚刚测试的内容.可以在没有`begin ... end`的情况下创建具有多个表达式的宏.但是,如果你在一个只需要一个元素的地方使用那个宏(比如在`io:format`中),那么`begin ... end`就是你要走的路. (2认同)

Pas*_*cal 6

评估一个catch(总是同一个想法让多个表达式减少到一个)

Res = (catch
    begin
        C = foo(Bar),
        io:format("evaluation of C ok~n"),
        D = bar(A, B, C)
     end),
Run Code Online (Sandbox Code Playgroud)


Dmi*_*aev 5

正如前面的回答者提到的,只要您需要有多个表达式但只允许一个表达式,就可以使用此构造。

不过,大多数这样的案例都会被认为是臭作风。我只记得需要使用单个表达式的几个地方:函数调用中的参数、catch表达式、case of以及try of列表理解。除了列表理解之外的所有这些都不应该与begin end构造一起使用,因为变量泄漏到外部作用域可能导致后续绑定变得匹配。

列表理解表达式是不同的,因为它被转换为具有自己的作用域的单独函数,并且没有引入begin end泄漏到外部作用域的变量。