• 返回多个值

    返回多个值

    我们经常想让一个函数返回多个值,使用元组来实现这一目的是十分方便的。

    例如,函数parse_int(List)从一个由ASCII字符构成的列表List中提取最开始的数字,如果存在,就返回一个由被提取出来的数字和列表剩下的部分组成的元组,如果列表中没有数字的话,就返回原子式eoString

    1. parse_int(List) ->
    2. parse_int(skip_to_int(List), 0).
    3.  
    4. parse_int([H|T], N) when H >= $0, H =< $9 ->
    5. parse_int(T, 10 * N + H - $0);
    6. parse_int([], 0) ->
    7. eoString;
    8. parse_int(L, N) ->
    9. {N,L}.

    skip_to_int(L)返回L中第一个以ASCII字符09中的任意一个开始的子列表。

    1. skip_to_int([]) ->
    2. [];
    3. skip_to_int([H|T]) when H >= $0, H =< $9 ->
    4. [H|T];
    5. skip_to_int([H|T]) ->
    6. skip_to_int(T).

    如果我们使用字符串"abcd123def""abcd123def"的列表形式是[97,98,99,49,50,51,100,101,102])来测试parse_int

    1. > tuples:parse_int("abc123def").
    2. {123,[100,101,102]}}

    parse_int的基础上,可以实现一个提取所有嵌入在字符串里面的数字的解释器。

    1. parse_ints([]) ->
    2. [];
    3. parse_ints(L) ->
    4. case parse_int(L) of
    5. eoString ->
    6. [];
    7. {H,Rest} ->
    8. [H|parse_ints(Rest)]
    9. end.

    因此:

    1. > tuples:parse_ints("abc,123,def,456,xx").
    2. [123,456]