通过委托现有函数实现协议

5

我正在通过模拟一款棋盘游戏来学习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

...这段代码无法编译。我也尝试了没有使用def的代码。

1个回答

7

尝试使用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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接