返回多个值

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

例如,函数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]