elixir constantize一个字符串来获取模块(String.to_module / 1)?

时间:2017-04-13 00:58:33

标签: elixir phoenix-framework

我在会话中存储一些元数据,以便根据字符串访问不同的模块。

有没有办法做到这一点?

String.to_module("MyApp.Vendor")   #=> MyApp.Vendor
String.to_module("MyApp.Customer") #=> MyApp.Customer

然后,最终目标是使用account_type按ID查找Struct,以执行特定于该类型的操作。

account = Repo.get(String.to_module(account_type), account_id)
do_something_with(account)

def do_something_with(%Customer{id: id}) do 
  # yada yada
end

def do_something_with(%Vendor{id: id}) do 
  # something else
end

2 个答案:

答案 0 :(得分:3)

我建议使用Module模块。

iex(1)> Module.concat ["Repo"]
Repo
iex(2)> Module.safe_concat ["Repo"]
Repo

答案 1 :(得分:2)

您将要使用String.to_existing_atom

$testStr = "Endpoint=sb://abcdefg.servicebus.windows.net/;SharedAccessKeyName=listenkey_1137;SharedAccessKey=W2c26OiBwae9f/vgPcJWgtD709oTTJu1VlB8i4OkqUc=;EntityPath=listen_1137"

$parts = $testStr -split "EntityPath"

Write-Host $parts[0]

请注意,iex(5)> a = String.to_existing_atom("Elixir.Enum") Enum iex(6)> apply(a, :reverse, [[1, 2, 3]]) 前缀很重要。如果您不包含该内容,系统将无法知道您要查找的内容。