可以__using__在模块末尾插入吗?

时间:2016-06-03 01:54:25

标签: elixir

让我们说我有一个模块我正在制作模式匹配是其大部分功能,如结构或花哨的case语句;有没有一种方法use Module可以在其使用的模块的底部处插入一个子句?这样做的原因是添加默认子句,这些子句将捕获与声明的那些失败的匹配。

对于一个人为的例子:

defmodule NumberToNumber do
    use SwitchLib, default: 0
#   import SomeMacros

    opt 1, "one"
#   convert("one"), do: 1

    opt 2, "two"
    opt 3, "three"
    opt 4, "four"

    default 0            <-- Can this be procedurally generated?
#   convert(_), do: 0    <--     or this, for that matter,

end

这是可能的,还是我应该采用不同的方式?我的备份计划是引用一个convert(_)来尝试__MODULE__.convert(arg)本身,并且不会单独进行匹配。

无论如何,上述方法是否可以由编译器实现?

1 个答案:

答案 0 :(得分:3)

是的,

@before_compile之类的回调允许您在定义完成时将代码注入模块。

除了@before_compile之外,还有其他有用的模块属性,例如@on_definition@after_compile,您可以在docs for the Module module中详细了解。

所有这些工具都可以与__using__或vanilla宏一起使用,以创建动态生成的代码,允许您编写一个循环,为opt i的任意范围创建i语句}。您可以在Macro moduleMacro.Env的文档中找到有关宏和编译环境的有用信息。