模式匹配二郎?(Pattern Matching Erlang?)

2019-10-28 09:04发布

我有这样的代码用if语句正试图获取用户输入yes或no如果用户输入比对请求被拒绝的任何其他。 这是我的错误:

** exception error: no match of right hand side value "yes\n"
     in function  messenger:requestChat/1 (messenger.erl, line 80)

代码在这里:

requestChat(ToName) ->
    case whereis(mess_client) of
        undefined ->
            not_logged_on;
         _ -> mess_client ! {request_to, ToName},
                request_to = io:get_line("Do you want to chat?"),
                {_, Input} = request_to,
                if(Input == yes) ->
                    ok;
                    true -> {error, does_not_want_to_chat}
                end
    end.

Answer 1:

在这种情况下,你可以使用命令行来测试你为什么得到一个错误(或到文档)。

如果你试试:

1> io:get_line("test ").
test yes
"yes\n"
2>

你可以看到,IO:get_line / 1不返回一个元组{ok,Input}但一个简单的字符串由AA回车结束: "yes\n" 。 这是它在报告错误消息。

所以,你可以修改代码来:

requestChat(ToName) ->
    case whereis(mess_client) of
        undefined ->
            not_logged_on;
         _ -> mess_client ! {request_to, ToName},
                if 
                    io:get_line("Do you want to chat?") == "yes\n" -> ok;
                    true -> {error, does_not_want_to_chat}
                end
    end.

但我更喜欢case语句

    requestChat(ToName) ->
        case whereis(mess_client) of
            undefined ->
                not_logged_on;
             _ -> mess_client ! {request_to, ToName},
                    case io:get_line("Do you want to chat?") of
                        "yes\n" -> ok;
                        "Yes\n" -> ok;
                        _ -> {error, does_not_want_to_chat}
                    end
        end.


文章来源: Pattern Matching Erlang?