How to call a method dynamically in Elixir, by specifying both module and method name?

前端 未结 1 1283
梦如初夏
梦如初夏 2021-02-01 14:22

I\'d like to know what exactly a method name is in elixir:

array = [1,2,3]
module_name = :lists
method_name = :nth                  # this not working
module_nam         


        
相关标签:
1条回答
  • 2021-02-01 14:29

    You can use apply/3 which is just a wrapper around :erlang.apply/3. It simply invokes the given function from the module with an array of arguments. Since you are passing arguments as the module and function names you can use variables.

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

    If you want to understand more about how elixir handles function calls (and everything else) you should take a look at quote and unquote.

    contents = quote do: unquote(module_name).unquote(method_name)(1, unquote(array))
    

    which returns the homoiconic representation of the function call.

    {{:.,0,[:lists,:nth]},0,[1,[1,2,3]]}
    

    You can unquote the quoted function call with Code.eval_quoted/3

    {value, binding} = Code.eval_quoted(contents)
    

    Edit: here is an example using Enum.fetch along with a var.

    quoted_fetch = quote do: Enum.fetch([1,2,3], var!(item));             
    {value, binding} = Code.eval_quoted(quoted_fetch, [item: 2])
    
    0 讨论(0)
提交回复
热议问题