为什么Erlang认为字符串模块函数未定义?

时间:2017-06-30 01:35:07

标签: erlang

在学习Erlang的基础知识时(特别是通过this MOOC),我正在进行Exercism Erlang练习,目前我正在进行Bob。在咨询了Erlang文档之后,我已经编写了我认为应该是问题的功能解决方案,但是我遇到了运行时错误,我无法弄清楚实际导致它的原因,以及如何解决问题。我的代码编译得很好,并且是:

-module(bob).
-export([test_version/0,response_for/1]).

test_version() ->
    1.

response_for(Message) ->
    Trimmed = string:trim(Message),
    AllUpper = string:equal(Trimmed, string:uppercase(Trimmed)),
    Empty = string:is_empty(Trimmed),
    EndsWithQuestion = string:equal("?", lists:last(Trimmed)),
    if
        AllUpper -> "Whoa, chill out!";
        Empty -> "Fine. Be that way!";
        EndsWithQuestion -> "Sure.";
        true -> "Whatever."
    end.

您可以忽略test_version函数,它是测试代码的单元测试的一部分,以检查您是否有正确的解决方案。单元测试可用here。我在每一个函数测试中得到的错误是相同的,如下所示:

  

bob_tests:在功能中响应_to_something_test ... 失败   字符串:trim / 1在调用中称为trim(“Tom-ay-to,tom-aaaah-to。”)   来自bob:response_for / 1   (C:/Users/jcoo092/exercism/erlang/bob/_build/test/lib/bob/src/bob.erl,   第8行来自bob_tests:' - bob_responds / 2-fun-0 - '/ 2   (C:/Users/jcoo092/exercism/erlang/bob/_build/test/lib/bob/test/bob_tests.erl,   来自bob_tests的第71行:responds_to_something_test / 0   **错误:undef输出:<<“”>>

我查看了undef错误的含义,显然这意味着Erlang运行时认为string:trim()函数是未定义的(第8行是Trimmed = ...行)。我试过跳过那个并继续其他人,但他们也给出了同样的错误。显然我在这里做错了,因为这些功能列在Erlang网站的文档中,但我真的看不出问题所在。

有人可以解释一下我做错了什么,以及如何解决它?

1 个答案:

答案 0 :(得分:2)

Erlang/OTP 20执行您的代码,它确实给了我一个错误,但它不是您发布的错误。

** exception error: no function clause matching unicode_util:cp(46) (unicode_util.erl, line 285)
 in function  string:equal_1/2 (string.erl, line 508)
 in call from bob:response_for/1 (src/bob.erl, line 11)

这是由于lists:last(Trimmed)获取Trimmed字符串的最后一个字符。这不是unicode:chardata()类型,因为函数string:equal/2要求两个参数都是。

将其包含在列表中可以解决上述问题:

 EndsWithQuestion = string:equal("?", [lists:last(Trimmed)]),