Elixir语言中 Kernel.defoverridable 相关用法介绍如下。
用法:
defoverridable(keywords_or_behaviour)
(宏)
使当前模块中的给定定义可覆盖。
如果用户定义了具有相同名称和数量的新函数或宏,则丢弃可覆盖的函数或宏。否则,使用原始定义。
被覆盖的定义可能具有与原始定义不同的可见性:公共函数可以被私有函数覆盖,反之亦然。
宏不能作为函数被覆盖,反之亦然。
示例
defmodule DefaultMod do
  defmacro __using__(_opts) do
    quote do
      def test(x, y) do
        x + y
      end
      defoverridable test: 2
    end
  end
end
defmodule InheritMod do
  use DefaultMod
  def test(x, y) do
    x * y + super(x, y)
  end
end
如上例所示,super 可用于调用默认实现。
如果已定义@behaviour,则还可以使用模块作为参数调用defoverridable。调用 defoverridable 的所有实现的回调都将被标记为可覆盖。
示例
defmodule Behaviour do
  @callback foo :: any
end
defmodule DefaultMod do
  defmacro __using__(_opts) do
    quote do
      @behaviour Behaviour
      def foo do
        "Override me"
      end
      defoverridable Behaviour
    end
  end
end
defmodule InheritMod do
  use DefaultMod
  def foo do
    "Overridden"
  end
end
相关用法
- Elixir Kernel.defexception用法及代码示例
 - Elixir Kernel.defmodule用法及代码示例
 - Elixir Kernel.defmacro用法及代码示例
 - Elixir Kernel.defdelegate用法及代码示例
 - Elixir Kernel.defguard用法及代码示例
 - Elixir Kernel.defstruct用法及代码示例
 - Elixir Kernel.defp用法及代码示例
 - Elixir Kernel.def用法及代码示例
 - Elixir Kernel.destructure用法及代码示例
 - Elixir Kernel.div用法及代码示例
 - Elixir Kernel.SpecialForms.case用法及代码示例
 - Elixir Kernel.round用法及代码示例
 - Elixir Kernel.left / right用法及代码示例
 - Elixir Kernel.put_in用法及代码示例
 - Elixir Kernel.tl用法及代码示例
 - Elixir Kernel.left - right用法及代码示例
 - Elixir Kernel.tuple_size用法及代码示例
 - Elixir Kernel.to_charlist用法及代码示例
 - Elixir Kernel.base ** exponent用法及代码示例
 - Elixir Kernel.left !== right用法及代码示例
 - Elixir Kernel.if用法及代码示例
 - Elixir Kernel.spawn_monitor用法及代码示例
 - Elixir Kernel.to_string用法及代码示例
 - Elixir Kernel.length用法及代码示例
 - Elixir Kernel.first..last用法及代码示例
 
注:本文由纯净天空筛选整理自elixir-lang.org大神的英文原创作品 Kernel.defoverridable(keywords_or_behaviour)。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。
