我对Elixir和函数式编程语言都比较陌生。
在Elixir中,我想通过给定模块名称的字符串来调用一个特定的函数。
我已经写出了以下(非常糟糕的)代码,它基本上实现了我想要的功能:
module_name = elem(elem(Code.eval_file("module.ex", __DIR__), 0), 1)
apply(module_name, :helloWorld, [])
这个(至少是我理解的)会在当前目录中编译已经编译好的module.ex
模块。我从两个元组中提取模块名称(不是字符串,实际上我不知道它是什么数据类型),并对其运行方法helloWorld
。
这段代码有两个问题:
它会打印一个警告,例如
redefining module Balance
。我肯定不想在生产环境中发生这种情况。据我所知,此代码将编译
module.ex
。但是,由于module.ex
已经编译和加载,我不希望这种情况发生。
我不需要按文件名调用这些模块上的方法,模块名也可以。但它必须是动态的,例如,在命令行输入“Book”应该在检查模块是否存在后,调用函数Book.helloWorld
。
谢谢。
String.to_existing_atom
的原因:String.to_atom
暴露了一个攻击漏洞。请参阅 https://til.hashrocket.com/posts/gkwwfy9xvw-converting-strings-to-atoms-safely 以获取详细信息。 - biagidp