【发布时间】:2015-12-29 17:27:54
【问题描述】:
我有以下设计模式:我有一个长生不老药模块,它响应增长/变化数量的functions/0,称为Defaults。我也有CustomConfig 模块,它基本上是结构,派生默认值并假设实例化如下:
%CustomConfig{ foo: "bar" }
初始化属性被覆盖,其他属性取自Defaults,而那些在Defaults 中没有同名函数的属性将被拒绝。到目前为止,一切顺利。
为了实现这种独立于内容的行为(Defaults 中的函数列表),我使用了一个宏(在其他模块中,因为不能使用宏,在同一模块中定义,在结构声明中):
defmacro define_struct_with_defaults do
quote do
defstruct Map.to_list(
quote do: unquote(Enum.reduce(Dict.keys(
Defaults.__info__(:functions)), %{}, fn(k, acc) ->
Map.put(acc, :"#{k}", apply(Defaults, :"#{k}", []))
end)))
end
end
虽然这可以正常工作,但我很确定,应该有更直接/优雅/不那么繁琐的方式来实现此功能。
所以我的问题是:如何在不围绕 map-reduce 跳舞的情况下从 Map 声明 defstruct?
【问题讨论】: