gpt4 book ai didi

function - Elixir中直接调用模块函数的defdelegate和def有什么区别

转载 作者:行者123 更新时间:2023-12-02 19:59:11 24 4
gpt4 key购买 nike

我有一个主要用作命名空间的模块。让我们称之为 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

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

最佳答案

我能想到的一些区别:

  1. 当您使用 defdelegate 时,您的意图非常明确,您只是将该方法委托(delegate)给另一个模块中的另一个方法。这只是一个愚蠢的转发器。
  2. 使用defdelegate,您无法更改参数,无论是参数的顺序、添加还是删除。因此,如果您真正想要的只是转发方法调用,请使用 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

关于function - Elixir中直接调用模块函数的defdelegate和def有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38189267/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com