【问题标题】:Implementing a protocol by delegating to existing functions通过委托现有功能实现协议
【发布时间】:2013-08-14 12:44:43
【问题描述】:

我正在通过为棋盘游戏建模来学习 Elixir,并且我有以下代码:

defprotocol Board do
  def can_handle_move(self)
  def handle_move(self, move)
end

defimpl Board, for: List do
  def can_handle_move(self), do: Enum.empty?(self)
  def handle_move(self, move), do: List.delete(self, move)
end

实现看起来比实际更复杂。实际上,can_handle_move 只是 Enum.empty?handle_move 只是 List.delete。 Elixir 有办法表达这一点吗?比如:

defimpl Board, for: List do
  def can_handle_move = &Enum.empty?/1
  def handle_move = &List.delete/2
end

...无法编译。我也试过没有defs。

【问题讨论】:

    标签: elixir


    【解决方案1】:

    试试Kernel#defdelegate/2吧。

    defimpl Board, for: List do
      defdelegate can_handle_move(self), to: Enum, as: :empty?
      defdelegate handle_move(self, move), to: List, as: :delete
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      • 2013-11-01
      • 2014-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多