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



在学习Erlang的基础知识(特别是通过这个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 函数,它是测试代码的单元测试的一部分,以检查您是否具有正确的解决方案。 此处提供了单元测试。 我在每次功能测试中遇到的错误都是相同的,如下所示:

bob_tests: responds_to_something_test...功能失败string:trim/1 在调用中称为 trim("Tom-ay-to, tom-aaaah-to."( 从鲍勃: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, 第 71 行(从 bob_tests:responds_to_something_test/0 开始呼叫 **错误:undef 输出:<<">>

我已经查找了 undef 错误的含义,显然这意味着 Erlang 运行时认为 string:trim(( 函数未定义(第 8 行是修剪 = ...行(。 我尝试跳过那个并继续其他,但他们给出了相同的错误。 显然我在这里做错了什么,因为这些函数列在 Erlang 网站的文档中,但我真的看不出问题是什么。

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

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)采用修剪字符串的最后一个字符。这不是unicode:chardata()类型,因为函数string:equal/2要求两个参数都是。

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

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

最新更新