问题 Elixir的模块是原子吗?


我正在努力了解Elixir中的模块。因为在Erlang中它们只是原子,但在Elixir原子中起始于 : 字符。 所以我在iex中检查了这些表达式:

iex(16)> is_atom(List) 
true
iex(17)> is_atom(:List)
true
iex(18)> List == :List
false
iex(19)> a = List
List
iex(20)> b = :List
:List

所以两者都很清楚 List 和 :List 是原子。但是,它如何在Erlang互操作层上运行?因为Erlang的 ok 等于Elixir的 :ok
那么这两个中的哪一个(List 和 :List)等于 'List' 在Erlang?


2540
2018-04-16 12:01


起源



答案:


Interactive Elixir (1.0.4) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)> List == :List
false
iex(2)> List == :'Elixir.List'
true

Elixir中的所有大写原子自动接收 Elixir. 字首。


16
2018-04-16 12:05



很棒的答案!要在命名方面100%精确, List, String 在Elixir中称为别名,它们扩展为原子。所以 List 扩展为:“Elixir.List”。但是,您可以使用该别名指向任何您想要的别名 alias 特殊形式,例如: alias :foo, as: List。 - José Valim
@JoséValim如何从字符串中获得这样的别名? String.to_atom("List") 给 :List。我用 {atom, _} = Code.eval_string("List") 但我想这不是最安全的做法 - Krzysztof Wende
检查 Module.concat/2 和 Module.split/1。 - José Valim


答案:


Interactive Elixir (1.0.4) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)> List == :List
false
iex(2)> List == :'Elixir.List'
true

Elixir中的所有大写原子自动接收 Elixir. 字首。


16
2018-04-16 12:05



很棒的答案!要在命名方面100%精确, List, String 在Elixir中称为别名,它们扩展为原子。所以 List 扩展为:“Elixir.List”。但是,您可以使用该别名指向任何您想要的别名 alias 特殊形式,例如: alias :foo, as: List。 - José Valim
@JoséValim如何从字符串中获得这样的别名? String.to_atom("List") 给 :List。我用 {atom, _} = Code.eval_string("List") 但我想这不是最安全的做法 - Krzysztof Wende
检查 Module.concat/2 和 Module.split/1。 - José Valim