gpt4 book ai didi

erlang - 如何通过指定模块和方法名称在 Elixir 中动态调用方法?

转载 作者:行者123 更新时间:2023-12-03 08:26:28 26 4
gpt4 key购买 nike

我想知道 Elixir 中的方法名称到底是什么:

array = [1,2,3]
module_name = :lists
method_name = :nth # this not working
module_name.method_name(1, array) # error, undef function lists.method_name/2
module_name.nth(1, array) # returns 1, module_name is OK. It's an atom

但我可以在 erlang 中做几乎相同的事情:
A = [1,2,3].
X = lists.
Y = nth.
X:Y(1,A). # returns 1

我怎么能在 Elixir 中做到这一点?

最佳答案

您可以使用 apply/3这只是 :erlang.apply/3 的包装.它只是invokes the given function from the module with an array of arguments .由于您将参数作为模块和函数名称传递,因此您可以使用变量。

apply(:lists, :nth, [1, [1,2,3]])
apply(module_name, method_name, [1, array])

如果您想了解更多关于 elixir 如何处理函数调用(以及其他所有内容)的信息,您应该查看 quoteunquote .
contents = quote do: unquote(module_name).unquote(method_name)(1, unquote(array))

它返回函数调用的同音表示。
{{:.,0,[:lists,:nth]},0,[1,[1,2,3]]}

您可以 unquote引用的函数调用 Code.eval_quoted/3
{value, binding} = Code.eval_quoted(contents)

编辑:这是一个使用 Enum.fetch 和 var 的示例。
quoted_fetch = quote do: Enum.fetch([1,2,3], var!(item));             
{value, binding} = Code.eval_quoted(quoted_fetch, [item: 2])

关于erlang - 如何通过指定模块和方法名称在 Elixir 中动态调用方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13230965/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com