无法匹配正确的功能

时间:2017-09-30 08:29:50

标签: erlang

这是我的代码:

N

可以使用:

-record(user,{id,name,group,age}).

adult_section(U=#user{})  when U#user.age  >=18   -> "allowed";

adult_section(_)    ->  "no permission".

但是当我尝试这个时:

>records_new:adult_section(#user{id=1,name='Ray',group=admin,age=10}).
  output:  "no permission"

我没有按照第二顺序给出用户的年龄,为什么它可以工作,为什么不是> records_new:adult_section(#user{}). "allowed"

2 个答案:

答案 0 :(得分:6)

由于您的记录没有age的默认值,因此如果您创建记录而未指定age的值,则默认为原子undefined

1> #user{}.
#user{id = undefined,name = undefined,group = undefined,
      age = undefined}

在Erlang中,原子比大于整数:

2> undefined > 18.
true
3> foo > 100000000.
true

如果您指定年龄的默认值,例如0,您的功能按预期运行:

-record(user,{id,name,group,age = 0}).
1> #user{}.
#user{id = undefined,name = undefined,group = undefined,
      age = 0}
2> a:adult_section(#user{}).
"no permission"

答案 1 :(得分:1)

你应该研究Dogbert answer。他的解释是现实的。

我只想补充一点,你可以保护自己免受这种"坏数据"通过扩大警卫注射。

adult_section(U=#user{}) when 
    is_integer(U#user.age) andalso
    U#user.age  >=18   -> 
  "allowed";