如何重构一个替换参数模式匹配的函数

Pau*_*iro 1 elixir

我有这个功能:

def update(%Evento{} = evento, attrs, dataSchema) do
    evento
    |> dataSchema.changeset(attrs)
    |> Repo.update()
end
Run Code Online (Sandbox Code Playgroud)

这与%Evento{}结构有关.
我想,使其独立的结构和参数传递代替,从而使调用函数时,我可以通过%Evento{},%News{},%Contact{}或任何结构我想,同时保持相同的功能/模式匹配检查.

Dog*_*ert 6

您可以使用模式接受任何结构作为参数%_{}:

def update(%_{} = struct, attrs, dataSchema) do
  ...
end
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用模式%module{}和警卫接受列入白名单的结构集:

def update(%module{} = struct, attrs, dataSchema) when module in [Evento, Foo, Bar] do
  ...
end
Run Code Online (Sandbox Code Playgroud)

编辑:更新以使用%module{}ŁukaszNiemier在评论中建议的新模式!