Erlang Thursday – lists:member/2

为了和每周的 Ruby Tuesday 系列文章中关于Enumerable#include?函数来个跨界对比,我决定着重介绍 Erlang 中相同类型的函数,lists:member/2。

首先给不熟悉Erlang的同学们补充一下知识:lists:member/2 表达的意思是在lists模块里有个名字叫member的函数,它有两个参数。Arity这个词的意思表示这个函数接受的入参的个数。在Erlang中,模块很重要,因为它是所有函数赖以生存的容器--另外也是因为模块在Erlang里是代码重新装载的单元--为了重新载入某个方法的新版本,必需指定具体模块。

总而言之,模块lists的函数member接受两个入参:一个是被查找的元素,它是Erlang的一种由任意数据类型组成的数据,另一个是被检索的由Erlang的各种类型数据组成的列表;如果被查找的元素在列表里被找到,则返回true。一个Erlang的term是任意Erlang数据类型组成的数据。

为了方便大家运行,下面的表达式是通用的写法,返回值则加上了%符号,这个符号是Erlang注释符号,这样就方便大家直接拷贝下面的表达式然后复制到Erlang的shell上运行。

这个函数能够很方便地判断一个数字是否在一个由数字组成的列表里:

1
2
3
4
lists:member(4, [1, 2, 3, 5, 8, 13, 21]).
% false
lists:member(13, [1, 2, 3, 5, 8, 13, 21]).
% true

或者判断一个原子是否在一个由原子组成的列表里:

1
2
3
4
lists:member(c, [a, b, c, d]).
% true
lists:member(q, [a, b, c, d]).
% false

或者由更复杂的term组成的列表,比如元组,或者包含列表的元组:

1
2
3
4
5
6
lists:member({d, 4}, [{a, 1}, {b, 2}, {c, 3}, {d, 4}]).
% true
lists:member({'Foo', [bar, baz]}, [a, 1, {'Foo', [bar, baz]}]).
% true
lists:member({fu, [bar, baz]}, [a, 1, {'Foo', [bar, baz]}]).
% false

甚至是判断一个整数或字符是否在一个字符串里:

1
2
3
4
5
6
lists:member($a, "banana").
% true
lists:member(97, "banana").
% true
lists:member($A, "banana").
% false

如果你仔细观察,你会发现,在Erlang里字符串实际上是由整数组成的列表。

希望这是一个有趣的Ruby和Erlang的比较;同时如果你对它不熟悉的话,能让你更了解Erlang。

原文链接: https://www.proctor-it.com/erlang-thursday-lists-member/