【问题标题】:no match of right hand side value右手边值不匹配
【发布时间】:2012-12-12 09:06:01
【问题描述】:

我在看《七周七种语言》这本书,一天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 函数,但我想自己做一个有趣/学习的函数。

提前致谢

【问题讨论】:

    标签: erlang


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 它像老板一样工作。谢谢!我正在查看旧的 regex:split 文档。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2014-06-27
      • 2016-02-16
      • 2019-09-13
      • 2014-04-12
      • 2022-11-28
      • 2016-05-05
      • 2015-12-06
      • 1970-01-01
      • 2019-02-27
      相关资源
      最近更新 更多