作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个主要用作命名空间的模块。让我们称之为 Bla
。还有其他子模块,它们具有具有该子模块特定功能的方法。
但是,我想要有两个选择:
导入主模块Bla
并直接使用子模块中的所有函数(不要单独编写多个导入)
仅导入特定子模块(如 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
正确的做法是什么?我有两种选择,但不知道,也许还有更好的一种。这两个选项等效吗?哪一个更可取?性能上有什么区别吗?
最佳答案
我能想到的一些区别:
defdelegate
时,您的意图非常明确,您只是将该方法委托(delegate)给另一个模块中的另一个方法。这只是一个愚蠢的转发器。defdelegate
,您无法更改参数
,无论是参数的顺序、添加还是删除。因此,如果您真正想要的只是转发方法调用,请使用 defdelgate,因为搞砸的范围较小。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/
有人可以为defdelegate 提供一个简单的例子吗? .我找不到任何东西,很难理解。 defmodule Dummy do def hello, do: "hello from dummy"
我是一名优秀的程序员,十分优秀!