关于Erlang案例陈述的问题。
我使用n2o作为我的Web应用程序框架。
在我的登录页面中,我创建了一个事件,以便在用户点击注册按钮时从页面中提取字段,
event(sign_up) - >
Gender = {Male,Female} = {wf:q(gm),wf:q(gf)},
Result = case Gender of
Gender when Male == true -> <<"M">>;
Gender when Female == true -> <<"F">>;
Gender when Male == false, Female == false -> <<"Not Selected">>
end,
error_logger:info_msg("Stuff",[{Result}]).
当我测试页面时,日志记录代码永远不会被命中。它只显示我删除case语句的时间。奇怪的是,在shell中执行case语句时,它会正确计算。
我错过了我的案例陈述的内容吗?
答案 0 :(得分:2)
要查看格式中的内容,您需要一个占位符(此处为~p代表漂亮的打印)int格式字符串。 我还简化了案例陈述。
event(sign_up) - >
Gender = {wf:q(gm),wf:q(gf)},
Result = case Gender of
{true,false} -> <<"M">>;
{false,true} -> <<"F">>;
{false,false} -> <<"Not Selected">>;
%[edit] check the type of the return value of wf:q/1 if different from boolean
Gender -> Gender
end,
error_logger:info_msg("Gender selection : ~p~n",[Result]).
答案 1 :(得分:0)
作为旁注,if
在这种情况下也是一个有趣(较短)的结构:
event(sign_up) - >
{M,F} = {wf:q(gm),wf:q(gf)},
Result = if M =:= true -> <<"M">>;
F =:= true -> <<"F">>;
true -> <<"Not Selected">> end,
error_logger:info_msg("Gender selection : ~p\n",[Result]).
=:=
(完全等于,比较值和类型)比==
更精确(等于,只比较值),因此,除非您只想比较值,否则最好使用完全等于 =:=
运算符(精确代码更好!)。
错误的类型。使用列表,而不是原子
阅读documentation,wf:q/1
返回一个字符串(又名列表)。
所以这些都不起作用。你必须将列表与列表进行比较(不要将列表转换为原子。永远不要这样做。这是错的,除非你完全知道你做了什么,并且知道如何做得对。)
因此,更正了示例,使用列表(小写):
event(sign_up) - >
{M,F} = {wf:q(gm),wf:q(gf)},
Result = if M =:= "true" -> <<"M">>;
F =:= "true" -> <<"F">>;
true -> <<"Not Selected">> end,
error_logger:info_msg("Gender selection : ~p\n",[Result]).
答案 2 :(得分:0)
在跟踪之后,我没有意识到元组中的这些函数返回了字符串文字,而不是我在case语句中用于匹配的原子填充模式。
考虑到这一点,工作解决方案:
event(sign_up) - >
Gender = {list_to_atom(wf:q(gm)),list_to_atom(wf:q(gf))},
Result = case Gender of
{true,false} -> <<"M">>;
{false,true} -> <<"F">>;
Gender -> <<"Not Selected">>;
end,
所以吸取的教训是确保您匹配的数据类型相同。
花了一段时间:)但是学到了宝贵的经验教训。