0

有什么方法可以知道在评估表达式后某个变量是否已绑定?

我的代码:

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

我需要知道是否有任何“之后”可以使用。也许那个“好的”可以用于我的目的?

谢谢!

4

2 回答 2

1

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部分中,则该过程将继续,否则将崩溃。永远不会执行下一行代码(如果有)。
于 2013-08-04T08:37:55.157 回答
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(除非所有分支都 bind After)。

这个异常根本无法捕获吗

这是:

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

但同样,您将无法Aftercatch部分或try结束后使用(当然,您可以绑定一个名为 的变量After)。

于 2013-08-03T05:14:53.377 回答