0

关于 Erlang 中的 case 语句的问题。

我使用 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 语句时,它的计算结果正确。

我的案例陈述是否遗漏了什么?

4

3 回答 3

2

要查看格式中的内容,您需要在格式字符串中使用占位符(这里的 ~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]).
于 2014-07-15T06:04:24.637 回答
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]).

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


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

阅读文档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]).
于 2014-07-15T08:52:40.727 回答
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,

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

花了一段时间 :) 但吸取了宝贵的经验教训。

于 2014-07-16T04:00:22.520 回答