2

我在看《七周七种语言》一书,一天erlang的自学一点问题都过不去。

我的代码是这样的:

-module(slsw).
-export([count_words/1]).
list_length([]) -> 0;
list_length(String) ->
    [_ | Tail] = String,
    1 + list_length(Tail).

count_words(Text) ->
    {_, R} = re:split(Text, " "),
    list_length(R).

但是,当我打开时erl,编译它(c(slsw).),然后尝试将它与这样的东西一起使用:

slsw:count_words("yoo dude, this is a test").          

我得到了这个烦人的运行时异常:

** exception error: no match of right hand side value [<<"yoo">>,<<"dude,">>,<<"this">>,<<"is">>,<<"a">>,
                                                       <<"test">>]
     in function  slsw:count_words/1 (slsw.erl, line 19)

看起来它结束了数组,然后抛出这个异常..我做错了什么?

我也找到了这个string:words功能,但我想做我自己的乐趣/学习。

提前致谢

4

2 回答 2

3

re:split/2只返回一个列表,而不是一个元组。这可能是本书正文中的错字。

诚然,Erlang 错误消息对于刚接触该语言的人来说可能有点神秘,但可以帮助您阅读错误消息的提示是,它表示等号右侧的计算结果为[<<"yoo">>,<<"dude,">>,<<"this">>,<<"is">>,<<"a">>,<<"test">>](简单地来自 re: split - 即二进制文件列表),并且无法将其与左侧的 2 元组匹配。

因此,如果您只是将count_words功能更改为以下内容,那就足够了:

count_words(Text) ->
    R = re:split(Text, " "),
    list_length(R).
于 2012-12-12T01:05:22.853 回答
2

我不相信 re:split/2 返回一个元组 - 它返回一个列表。因此,您的 {_, R} = re:split/2 出现两行错误,因为函数的返回无法匹配 = 左侧的元组

于 2012-12-12T01:06:01.330 回答