没有右手边的值匹配

时间:2012-12-12 00:17:41

标签: 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功能,但我想做自己的乐趣/学习。

提前致谢

2 个答案:

答案 0 :(得分: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).

答案 1 :(得分:2)

我不相信re:split / 2返回一个元组 - 它返回一个列表。所以,你的{_,R} = re:split / 2两行错误因为函数的返回与=

左侧的元组不匹配