有什么方法可以知道在评估表达式后某个变量是否已绑定?
我的代码:
{ok, After} = ts_dynvars:lookup(last, DynVars),
我需要知道是否有任何“之后”可以使用。也许那个“好的”可以用于我的目的?
谢谢!
3种可能性:
After
尚未绑定,然后ts_dynvars:lookup/2
返回表单的结果,{ok,Value}
然后After
绑定到Value
(制作副本)并且程序转到下一行。After
已经绑定并ts_dynvars:lookup/2
准确返回{ok,After}
:模式匹配;
After
保持其价值;程序转到下一行。ts_dynvars:lookup/2
返回与前 2 行中描述的Ret
不匹配的结果。{ok,After}
然后执行停止,VM 抛出异常{badmatch,Ret}
。如果该行在acatch
或atry
部分中,则该过程将继续,否则将崩溃。永远不会执行下一行代码(如果有)。如果您(尝试)在表达式中引用未绑定的变量,则会出现编译错误。特别是,之后
{ok, After} = ts_dynvars:lookup(last, DynVars),
只有两种可能:如果模式匹配,After
被绑定,并且可以使用;如果没有,将引发异常,并且尝试使用的代码After
将永远不会被执行。
更新:
你是在告诉我在模式不匹配的情况下没有办法分支代码执行
当然有:
case ts_dynvars:lookup(last, DynVars) of
{ok, After} -> ...;
_ -> ... %% or other patterns
end
但编译器不会让你After
在其他分支或之后使用case
(除非所有分支都 bind After
)。
这个异常根本无法捕获吗
这是:
try
{ok, After} = ts_dynvars:lookup(last, DynVars),
...
catch
_:_ -> ...
end
但同样,您将无法After
在catch
部分或try
结束后使用(当然,您可以绑定一个名为 的新变量After
)。