在评估表达式后,有没有办法知道某个变量是否已被绑定?
我的代码:
{ok, After} = ts_dynvars:lookup(last, DynVars),
我是否需要知道是否有“After”与之合作。或许“ok”可以用于我的目的吗?
谢谢!
答案 0 :(得分:1)
如果您(尝试)引用表达式中的未绑定变量,则表示编译错误。特别是在
之后{ok, After} = ts_dynvars:lookup(last, DynVars),
只有两种可能性:如果模式匹配,After
绑定,可以使用;如果没有,将抛出异常,尝试使用After
的代码将永远不会被执行。
更新:
你是否告诉我在模式不匹配的情况下无法分支代码执行
当然有:
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
(您可以绑定名为{的 new 变量{1}},当然)。
答案 1 :(得分: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行中描述。然后执行停止和
VM抛出异常{badmatch,Ret}
。如果该行位于catch
或
一个try
部分,该过程将继续,否则会崩溃。下一个
代码行(如果有的话)永远不会被执行。