【问题标题】:What is the difference between defdelegate and def with call module function directly in Elixir在 Elixir 中直接调用模块函数的 defdelegate 和 def 有什么区别
【发布时间】:2016-07-04 16:44:26
【问题描述】:

我有一个主要用作命名空间的模块。让我们称之为Bla。还有其他子模块,它们具有对该子模块具有特定功能的方法。

但是,我想有两个选择:

1) 导入主模块Bla 并直接使用子模块中的所有功能(不要单独编写多个导入)

2) 仅导入特定的子模块,如 Bla.Subbla,以仅使用该模块中的函数,而不导入其他子模块中的函数

这就是我所拥有的:

defmodule Bla do
  defdelegate bla_func(text), to: Bla.Subbla
  defdelegate bla_func(text, opts), to: Bla.Subbla
end

defmodule Bla do
  def bla_func(text), do: Bla.Subbla.bla_func(text)
  def bla_func(text, opts), do: Bla.Subbla.bla_func(text, opts)
end

这样做的正确方法是什么?我有两个选择,但不知道,也许,还有更好的一个。这两个选项等效吗?哪个更可取?性能有区别吗?

【问题讨论】:

  • 我认为您应该考虑使用 use 并将有关您要导入的内容的选项传递给它。
  • 听起来不错,将阅读有关此选项的信息(我只是在学习 - 目前了解不多)

标签: function module elixir


【解决方案1】:

我能想到的一些区别:

  1. 当您使用defdelegate 时,您的意图非常明确,您只是将方法委托给另一个模块中的另一个方法。而且这只是一个愚蠢的转发器。
  2. 使用defdelegate,您无法更改arguments,无论是参数的顺序、添加还是删除。因此,如果您真正想要的只是转发方法调用,请使用 defdelgate,因为这样搞砸的空间较小。
  3. 在某些情况下,defdelegate 不是一个选项,因为您需要向转发功能添加更多数据,在这种情况下,您实际上没有选项。

因此,底线是:如果可能,请始终使用defdelegate,您将避免使用它的几类错误。例如下面:

defmodule Greet do
  def greet(name, greeting) do
    IO.puts "#{greeting} #{name}"
  end
end

defmodule DelegatedGreet do
  defdelegate greet(name, greeting), to: Greet
end

defmodule BuggyGreet do
  # scope for bugs like these
  def greet(name, greeting), do: Greet.greet(greeting, name)
end

【讨论】:

    【解决方案2】:

    正如@JustMichael 所说,在这种情况下最好使用use。它完全符合我的需要。

    defmodule SomeModuleWhereINeedSubbla do
      use Bla
    
      useful_func   # => Will print "Bla.Subbla.useful_func"
    end
    
    defmodule Bla do
      defmacro __using__(_) do
        quote do
          import Bla.Subbla
        end
      end
    end
    
    defmobule Bla.Subbla do
      def useful_func(), do: IO.puts "Bla.Subbla.useful_func"
    end
    

    【讨论】:

    • 这个答案被接受为替代方案,但它不回答原始问题。
    • 是的,真的,这不是答案。如果你知道答案会很高兴:)
    猜你喜欢
    • 1970-01-01
    • 2011-06-13
    • 2014-05-02
    • 2013-09-24
    • 1970-01-01
    • 2016-06-14
    • 2012-06-02
    • 1970-01-01
    相关资源
    最近更新 更多