【发布时间】:2016-05-20 00:54:29
【问题描述】:
假设一个 elixir 库定义:
defmodule Decoder do
def decode(%{"BOOL" => true}), do: true
def decode(%{"BOOL" => false}), do: false
def decode(%{"BOOL" => "true"}), do: true
def decode(%{"BOOL" => "false"}), do: false
def decode(%{"B" => value}), do: value
def decode(%{"S" => value}), do: value
def decode(%{"M" => value}), do: value |> decode
def decode(item = %{}) do
item |> Enum.reduce(%{}, fn({k, v}, map) ->
Map.put(map, k, decode(v))
end)
end
end
我想定义一个模块MyDecoder,它只是在上面的模块中再添加一个def decode。在 oo 语言中,这将通过某种继承/混合/扩展来完成。
如何在 elixir 中做到这一点?
【问题讨论】:
-
比如我需要在github.com/CargoSense/ex_aws/blob/…处添加
def decode(%{"NULL" => true}), do: nil到ExAws.Dynamo.Decoder -
这是实现中的错误吗?如果是这样,在修复发布之前制作 PR 并使用自己的 fork 怎么样?
-
这样做。想知道长生不老药中的一般解决方案是什么样的。据我所知,没有一个干净的方法可以在不重写原始库的情况下仅使用一个函数来扩展模块。
-
elixir 应该考虑添加一个
includes/extends。 -
这只是递归函数实现中断的特定情况下的问题,您无法控制整个源代码。 OO 通过继承解决的大多数其他问题实际上都可以在 Elixir 中非常优雅地解决。也就是说,即使 OO 也不允许您像在这里尝试那样添加子句,还是我弄错了?
标签: elixir