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

时间:2014-07-15 04:47:25

标签: 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 == true -> <<"F">>;
    Gender when Male == false, Female == false -> <<"Not Selected">>
end,

error_logger:info_msg("Stuff",[{Result}]).

当我测试页面时,日志记录代码永远不会被命中。它只显示我删除case语句的时间。奇怪的是,在shell中执行case语句时,它会正确计算。

我错过了我的案例陈述的内容吗?

3 个答案:

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

=:=(完全等于,比较值和类型)比==更精确(等于,只比较),因此,除非您只想比较值,否则最好使用完全等于 =:=运算符(精确代码更好!)。


错误的类型。使用列表,而不是原子

阅读documentationwf: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,

所以吸取的教训是确保您匹配的数据类型相同。

花了一段时间:)但是学到了宝贵的经验教训。