使用n2o框架时Erlang中的案例语句问题

使用n2o框架时Erlang中的案例语句问题,erlang,case,n2o,Erlang,Case,N2o,关于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

关于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}]).
活动(注册)->
性别={男性,女性}={wf:q(gm),wf:q(gf)},
结果=病例性别
男性时的性别==真->;
女性时的性别==真->;
男性==false,女性==false时的性别->
完,,
错误\u记录器:info\u msg(“Stuff”,[{Result}])。
当我测试页面时,日志代码永远不会被命中。它仅在删除case语句时显示。奇怪的是,在shell中执行case语句时,它的计算结果是正确的


我的案例陈述是否遗漏了一些内容?

若要查看格式中的内容,需要在格式字符串中插入一个占位符(这里的~p代表漂亮的打印)。 我还简化了案例陈述

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]).
活动(注册)->
性别={wf:q(gm),wf:q(gf)},
结果=病例性别
{true,false}->;
{false,true}->;
{false,false}->;
%[编辑]如果与布尔值不同,请检查wf:q/1返回值的类型
性别->性别
完,,
错误\记录器:信息\消息(“性别选择:~p~n,[Result])。

作为旁注,
如果在本例中也是一个有趣的(较短的)结构:

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]).

跟踪之后,我没有意识到元组中的这些函数返回的是字符串文本,而不是我在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,
活动(注册)->
性别={list_to_atom(wf:q(gm)),list_to_atom(wf:q(gf))},
结果=病例性别
{true,false}->;
{false,true}->;
性别->;
完,,
因此,经验教训是确保匹配的数据类型相同


这花了一段时间:)但得到了宝贵的教训。

日志消息现在显示,但当M或F为真时,结果总是返回。您确定
wf:q(gm)
返回的是原子而不是二进制或列表吗?首先检查。是否为您这样做:
wf:q/1
返回一个字符串(列表)。代码建议应按预期工作,在一个条件下:wf:q(gm)和wf:q(gf)必须返回true或false。我没有检查这些函数的输出结果,因此如果您遇到问题,我建议您查看文档,或者更容易地按照我在编辑的代码中的建议跟踪调用结果。请注意:
wf:q/1
返回字符串,而不是atom(这显然是错误的)
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,