我剛剛在Erlang的文檔(here)中登記了begin...end
,但沒有給出它的一些有用的例子。Erlang用於開始......結尾是什麼?
尋找這裏的StackOverflow我發現兩種情況下,人們會使用begin...end
,無論是在列表解析:
但我不知道是否有更多的這樣的使用。
任何人都可以提供另一種方案,其中begin...end
在Erlang中很有用嗎?
由於
我剛剛在Erlang的文檔(here)中登記了begin...end
,但沒有給出它的一些有用的例子。Erlang用於開始......結尾是什麼?
尋找這裏的StackOverflow我發現兩種情況下,人們會使用begin...end
,無論是在列表解析:
但我不知道是否有更多的這樣的使用。
任何人都可以提供另一種方案,其中begin...end
在Erlang中很有用嗎?
由於
宏,例如:
-define(M(A, B),
begin
C = foo(),
bar(A, B, C)
end).
謝謝@P_A。一些澄清,以便其他人不必測試我剛纔測試的內容。一個有多個表達式的宏可以不用'begin ... end'。但是,如果你在一個只有一個元素的地方使用這個宏(比如'io:format'),那麼'begin ... end'就是要走的路。 – MondKin
這是如何比-define(M(A,B),bar(A,B,foo()))更好。 ? –
這只是一個例子來說明如何使用'begin ... end' –
爲了評價趕上(總是相同的想法有多個表達減少到一個)
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 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: ','
您可以使用它創建快速代碼來評估和創建所需的值。例如'T = {1,2,begin 1 + 2 end} .'將評估'T = {1,2,3}' –
@MuzaayaJoshua但是您的示例即使沒有開始結束也可以運行。任何人都可以給出一個實際需要使用結束的例子嗎?還是他們喜歡花括號? – Aus
@Aus檢查下面的答案,有些例子不能在沒有開始的情況下完成...結束 – MondKin