Erlang Thursday – erlang:list_to_atom/1

今天的Erlang Thursday讲的是 erlang:list_to_atom/1.

erlang:list_to_atom/1 的入参是一个字符串,返回的是一个Erlang的原子。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
list_to_atom("foo").
% foo
list_to_atom("Foo").
% 'Foo'
list_to_atom("Foo_bar").
% 'Foo_bar'
list_to_atom("foo_bar").
% foo_bar
list_to_atom("foo"++"bar").
% foobar
list_to_atom("Erlang").
% 'Erlang'
list_to_atom("Elixir").
% 'Elixir'

这个函数在你必须要基于从外部系统读到的字符串,比如解析一个CSV类型的头部,生成键或标识符的时候有用。

1
2
lists:map(fun erlang:list_to_atom/1, string:tokens("firstName,lastName,age,gender,preferredName,dateOfBirth", ",")).
% [firstName,lastName,age,gender,preferredName,dateOfBirth]

当你用 erlang:list_to_atom/1 将从外部系统获取的字符串转换成原子的时候一定要小心,因为它只能处理值为256以下的字符。任何字符值在256(注1)以下的字符串都能正常地用该函数转成一个原子。

1
2
3
4
5
6
7
8
9
10
11
12
13
list_to_atom("Joe, Mike, and Robert").
% 'Joe, Mike, and Robert'
list_to_atom("it's").
% 'it's'
list_to_atom("heyn").
% 'heyn'€
list_to_atom("with_supported_char"++[255]).
% with_supported_charÿ
list_to_atom("with_non_supported_char"++[256]).
% ** exception error: bad argument
% in function list_to_atom/1
% called as list_to_atom([119,105,116,104,95,110,111,110,95,115,117,112,112,111,114,
% 116,101,100,95,99,104,97,114,256])

1、字符值必须是非负整数,范围是0到255。

原文链接: https://www.proctor-it.com/erlang-thursday-erlang-list_to_atom-1/