这是我的代码:
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"
。
答案 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";