Erlang - 检查未绑定的变量

时间:2013-08-03 00:07:59

标签: variables testing binding erlang

在评估表达式后,有没有办法知道某个变量是否已被绑定?

我的代码:

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

我是否需要知道是否有“After”与之合作。或许“ok”可以用于我的目的吗?

谢谢!

2 个答案:

答案 0 :(得分:1)

如果您(尝试)引用表达式中的未绑定变量,则表示编译错误。特别是在

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

只有两种可能性:如果模式匹配,After 绑定,可以使用;如果没有,将抛出异常,尝试使用After的代码将永远不会被执行。

更新:

  

你是否告诉我在模式不匹配的情况下无法分支代码执行

当然有:

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

但同样,您将无法在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部分,该过程将继续,否则会崩溃。下一个 代码行(如果有的话)永远不会被执行。