当使用register / 2时,当我尝试传递一个数字作为进程名称参数时,出现错误。在这里,我尝试将shell进程命名为“1”,并收到以下错误:
43> register(1,self()).
** exception error: bad argument
in function register/2
called as register(1,<0.93.0>)
对比这个命名shell'shelly':
44> register(shelly,self()).
true
文档说寄存器中的Name参数(Name,PID)必须是一个原子。我认为数字1确实是一个原子。
我的问题是:如何成功传递一个数字到寄存器/ 2,例如,传递绑定变量P = 1成功?
答案 0 :(得分:4)
原子是一个符号,与整数无关。没有从整数到原子的直接转换,但您可以使用中间列表:
1> Int_to_atom = fun(X) -> list_to_atom(integer_to_list(X)) end.
#Fun<erl_eval.6.106461118>
2> Int_to_atom(2).
'2'
3> P = 1.
1
4> Int_to_atom(P).
'1'
5>
答案 1 :(得分:2)
来自Erlang documentation on datatypes:
原子是文字,是名称的常量。原子应该被封闭 如果它不以小写字母开头,则用单引号(')表示 如果它包含除字母数字字符以外的其他字符, 下划线(_)或@。
你可以做到
register('1',self()).
(注意单引号,使其成为原子而不是数字。你可以通过尝试看到它不是数字而是原子
'1' + 1
当你期望它们可以互换时,你可能会想到“ term ”。 Erlang 术语是一个单一的数据。作为术语的一些例子: