有沒有任何方法可以在表達式評估之後知道某個變量是否已被綁定?Erlang - 檢查未綁定的變量
我的代碼:
{ok, After} = ts_dynvars:lookup(last, DynVars),
什麼,我需要知道是否有任何「後」與或無法正常工作。也許這個「好」可以用於我的目的?
謝謝!
有沒有任何方法可以在表達式評估之後知道某個變量是否已被綁定?Erlang - 檢查未綁定的變量
我的代碼:
{ok, After} = ts_dynvars:lookup(last, DynVars),
什麼,我需要知道是否有任何「後」與或無法正常工作。也許這個「好」可以用於我的目的?
謝謝!
如果您(嘗試)在表達式中引用未綁定的變量,則表示編譯錯誤。特別地,後
{ok, After} = ts_dynvars:lookup(last, DynVars),
只有兩種可能性:如果模式匹配,After
是約束,並且可以使用;如果沒有,則會拋出異常,並且嘗試使用After
的代碼將永遠不會執行。
UPDATE:
你告訴我有沒有辦法分支代碼執行的情況,即模式不匹配
當然有:
case ts_dynvars:lookup(last, DynVars) of
{ok, After} -> ...;
_ -> ... %% or other patterns
end
但編譯器不會讓你在其他分支中使用After
或case
(除非全分支綁定After
)。
在所有
此異常不開捕是:
try
{ok, After} = ts_dynvars:lookup(last, DynVars),
...
catch
_:_ -> ...
end
但同樣,你將無法使用After
在catch
部分或後try
端(你當然可以綁定新的變量名爲After
)。
你是否告訴我,在模式不匹配的情況下無法分支代碼執行?即這個例外是否不可捕捉? – kellogs
@kellogs查看更新後的答案。 –
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
部分,則該過程將繼續,否則將會崩潰。下一個 行代碼(如果有的話)將永遠不會執行。
在這種情況下'不會綁定'什麼情況? – kjw0188