让我们说我有一个模块我正在制作模式匹配是其大部分功能,如结构或花哨的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)
本身,并且不会单独进行匹配。
无论如何,上述方法是否可以由编译器实现?
答案 0 :(得分:3)
是的,
@before_compile
之类的回调允许您在定义完成时将代码注入模块。
除了@before_compile
之外,还有其他有用的模块属性,例如@on_definition
和@after_compile
,您可以在docs for the Module module中详细了解。
所有这些工具都可以与__using__
或vanilla宏一起使用,以创建动态生成的代码,允许您编写一个循环,为opt i
的任意范围创建i
语句}。您可以在Macro module和Macro.Env的文档中找到有关宏和编译环境的有用信息。