Erlang 如何使用if结构确定ets表是否为空

Erlang 如何使用if结构确定ets表是否为空,erlang,ets,Erlang,Ets,我是新来的二郎。我有一个学校项目,它使用ets:表格。 但在我想从ets:表中获取一些数据之前,我想使用if结构来检查表是否为空 if ets:first(Cal) =/= '$end_of_table' -> Event = ets:first(Cal), {TimeAtStart, Ref} = Event, NowTime = now(), Ms = timer:now_diff(NowTime, TimeAtStart)div 10

我是新来的二郎。我有一个学校项目,它使用ets:表格。 但在我想从ets:表中获取一些数据之前,我想使用if结构来检查表是否为空

 if 
   ets:first(Cal) =/= '$end_of_table' ->
     Event = ets:first(Cal),
     {TimeAtStart, Ref} = Event,
     NowTime = now(),
     Ms = timer:now_diff(NowTime, TimeAtStart)div 1000
   end,
现在这给了我一个错误:非法的守卫表达式

我不知道我做错了什么,请帮忙

致以友好的问候


Daan
如果
需要保护序列。所以它失败了。您可以在if之前进行测试,并使用结果,但是对于您的代码,当您获得“$end\u of_table”时,它也将失败,因为您没有
true
语句

我建议对您的代码使用case语句:

case ets:first(Cal)  of
     '$end_of_table' ->
           {error,no_entry};
     {TimeAtStart, _Ref} ->
           {ok,timer:now_diff(now(), TimeAtStart)div 1000}
end,

非法的guard语句来自从if语句guard中调用ets:first(Cal)函数。因此
如果ets:first(Cal)=/='$end\u of_table'->
无法正确编译。Guard语句只有一小部分可以使用的函数

另外,如果Erlang中的语句与其他语言稍有不同。至少有一个子句的计算结果必须为true。解释了这种行为,以及如果没有子句的计算结果为true,如何抛出错误

因此,将
ets:first(Cal)
移到if语句之外,并在代码中添加一个catch-all-true用例,应该可以:

Res = ets:first(Cal),
if 
  Res =/= '$end_of_table' ->
    Event = ets:first(Cal),
    {TimeAtStart, Ref} = Event,
    NowTime = now(),
    Ms = timer:now_diff(NowTime, TimeAtStart)div 1000;
  true -> ok %% you need a default clause
end,
然而,如果是我做我的学校项目,我会尝试使用ets:info函数来检查表格的大小,并在案例陈述中进行检查。签出,然后


仅供参考:在我用Erlang编程的整个过程中,我都没有使用过if语句。

我通常每5000行Erlang代码就有一个
if
-语句<代码>案例更常见。谢谢您的帮助。它很好用。实际上,我在我的项目中使用了这两种解决方案,只是出于教育目的。谢谢你的帮助。它很好用。实际上,我在我的项目中使用了这两种解决方案,只是出于教育目的。