如果我们有这样的模块名称:
Module.V1.CountryTest
Run Code Online (Sandbox Code Playgroud)
我可以像这样将它转换为String:
Module.V1.CountryTest |> to_string
Run Code Online (Sandbox Code Playgroud)
现在我有一些有趣的结果 iex
module = Module.V1.CountryTest |> to_string
"Elixir.Module.V1.CountryTest"
iex(2)> replace = Regex.replace(~r/Test/, module, "")
"Elixir.Module.V1.Country"
iex(3)> replace |> String.to_atom
Module.V1.Country
Run Code Online (Sandbox Code Playgroud)
所以,如果我删除Test.并将其转换回atom.它会给我回模块名称.但如果我replace或remove模块名称中的任何其他内容它给我这个输出:
some = Regex.replace(~r/Country/, replace, "")
"Elixir.Module.V1."
iex(5)> some |> String.to_atom
:"Elixir.Module.V1."
Run Code Online (Sandbox Code Playgroud)
任何人都可以解释一下这种行为吗?为什么它不允许任何其他部件更改或更换.这意味着让我回到输出
Module.V1.Country
Run Code Online (Sandbox Code Playgroud)
我的意思是,如果它可能.
谢谢.
Dog*_*ert 11
Elixir模块名称只是以前缀为原子的原子"Elixir.".Elixir打印的原子以"Elixir."与其他原子不同的方式开头并包含有效的Elixir模块名称:
iex(1)> :"Elixir.Foo"
Foo
iex(2)> :"Elixir.F-o"
:"Elixir.F-o"
Run Code Online (Sandbox Code Playgroud)
替换时Test,值的其余部分是有效的Elixir模块名称,但是当您替换时Country,最终会得到一个.不是有效模块名称的结尾.如果你也删除了点,你会得到你想要的:
iex(3)> Module.V1.Country |> to_string |> String.replace(~r/Country/, "") |> String.to_atom
:"Elixir.Module.V1."
iex(4)> Module.V1.Country |> to_string |> String.replace(~r/\.Country/, "") |> String.to_atom
Module.V1
Run Code Online (Sandbox Code Playgroud)
要将字符串转换为模块,您可能需要使用Module.safe_concat/1or /2:
Module.safe_concat(Module.V1, "CountryTest") # => Module.V1.CountryTest
Module.safe_concat(~w[Module V1 CountryTest]) # => Module.V1.CountryTest
Run Code Online (Sandbox Code Playgroud)