我正在阅读“七周七种语言”一书,并且在一天二郎的自学中不能传递一点问题。
我的代码是这样的:
-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
功能,但我想做自己的乐趣/学习。
提前致谢
答案 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两行错误因为函数的返回与=
左侧的元组不匹配