【问题标题】:elixir string to method arguments in macro长生不老药字符串到宏中的方法参数
【发布时间】:2017-01-03 22:23:03
【问题描述】:

我在 elixir 中使用宏纯粹是为了好玩,而不是为了利润 :)。所以我有一个逗号分隔的字符串,我想以该列表作为参数动态创建一个函数,即

defmacro  __using__(opts) do
  args = "a,b,c"
  quote do
    def test(unquote(args)) do
      IO.inspect("#{a},#{b},#{c}")
    end
  end
end

我的问题是创建的方法是:test("1,2,3") 而不是test(1,2,3),原因很明显。那么如何将字符串转换为方法参数呢?

克里斯

【问题讨论】:

    标签: macros elixir


    【解决方案1】:

    可能有更好的方法,但是将"a,b,c" 转换为可以注入def 的参数列表的一种方法是使用Code.string_to_quoted!/1unquote_splicing

    defmacro  __using__(_opts) do
      args = "a,b,c"
      args = Code.string_to_quoted!("[#{args}]")
      quote do
        def test(unquote_splicing(args)) do
          IO.inspect(unquote(args))
        end
      end
    end
    

    请注意,出于卫生考虑,您必须使用args 来访问变量,并且您不能在def 中直接访问abc

    完整示例:

    defmodule Macros do
      defmacro  __using__(_opts) do
        args = "a,b,c"
        args = Code.string_to_quoted!("[#{args}]")
        quote do
          def test(unquote_splicing(args)) do
            IO.inspect(unquote(args))
          end
        end
      end
    end
    
    defmodule Main do
      use Macros
    
      def main do
        test("a", "b", "c")
        test(1, 2, 3)
      end
    end
    
    Main.main
    

    输出:

    ["a", "b", "c"]
    [1, 2, 3]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-04
      • 2016-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多