2013-08-03 32 views
0

有沒有任何方法可以在表達式評估之後知道某個變量是否已被綁定?Erlang - 檢查未綁定的變量

我的代碼:

{ok, After} = ts_dynvars:lookup(last, DynVars), 

什麼,我需要知道是否有任何「後」與或無法正常工作。也許這個「好」可以用於我的目的?

謝謝!

+0

在這種情況下'不會綁定'什麼情況? – kjw0188

回答

1

如果您(嘗試)在表達式中引用未綁定的變量,則表示編譯錯誤。特別地,後

{ok, After} = ts_dynvars:lookup(last, DynVars), 

只有兩種可能性:如果模式匹配,After約束,並且可以使用;如果沒有,則會拋出異常,並且嘗試使用After的代碼將永遠不會執行。

UPDATE:

你告訴我有沒有辦法分支代碼執行的情況,即模式不匹配

當然有:

case ts_dynvars:lookup(last, DynVars) of 
    {ok, After} -> ...; 
    _ -> ... %% or other patterns 
end 

但編譯器不會讓你在其他分支中使用Aftercase(除非分支綁定After)。

在所有

此異常不開捕是:

try 
    {ok, After} = ts_dynvars:lookup(last, DynVars), 
    ... 
catch 
    _:_ -> ... 
end 

但同樣,你將無法使用Aftercatch部分或後try端(你當然可以綁定新的變量名爲After)。

+0

你是否告訴我,在模式不匹配的情況下無法分支代碼執行?即這個例外是否不可捕捉? – kellogs

+0

@kellogs查看更新後的答案。 –

1

3種可能性:

  • After尚未綁定和ts_dynvars:lookup/2返回 {ok,Value}然後After勢必Value(一份拷貝)的形式 結果和程序進入到下一行。
  • After已經綁定,並且ts_dynvars:lookup/2正好返回{ok,After}:模式匹配; After保持其價值;程序進入下一行。
  • ts_dynvars:lookup/2返回Ret不符合{ok,After}爲 在前面2行中描述。然後執行停止並且虛擬機引發異常{badmatch,Ret}。如果線路位於catch或 a try部分,則該過程將繼續,否則將會崩潰。下一個 行代碼(如果有的話)將永遠不會執行。