Elixir 什么是长生不老药爆炸功能?

Elixir 什么是长生不老药爆炸功能?,elixir,phoenix-framework,Elixir,Phoenix Framework,在阅读Phoenix教程(本节)时,我第一次注意到一个带有尾随感叹号/bang(!)的函数 后面的感叹号是什么意思?它有什么作用吗?我一直在四处搜索并尝试寻找,但我不确定我使用的术语是否正确。到目前为止,似乎只有作为约定的函数才会在失败时引发错误,但它始终意味着这一点 Dave Thomas的“编程长生不老药”中只提到了这一点: Identifiers in Elixir are combinations of upper and lower case ASCII characters, di

在阅读Phoenix教程(本节)时,我第一次注意到一个带有尾随感叹号/bang(!)的函数

后面的感叹号是什么意思?它有什么作用吗?我一直在四处搜索并尝试寻找,但我不确定我使用的术语是否正确。到目前为止,似乎只有作为约定的函数才会在失败时引发错误,但它始终意味着这一点

Dave Thomas的“编程长生不老药”中只提到了这一点:

Identifiers in Elixir are combinations of upper and lower case ASCII 
characters, digits, and underscores. Function names may end with a 
question mark or an exclamation point.
其中还提到:

Notice that when the file does not exist, the version with ! raises an
error. The version without ! is preferred when you want to handle
different outcomes using pattern matching...
这些都不能解释这是否是其他长生不老药或炼金术士或其他任何人使用的惯例。请帮助。

此:

请注意,当文件不存在时,版本为!提出 错误。没有的版本!当您想要处理 使用模式匹配的不同结果

如果你看一下源代码,就会更清楚。
符号只是一种语法约定。如果您看到包含
的函数符号在其名称中,表示可能存在同名函数,但没有
符号。这两个函数将做相同的事情,但它们将以不同的方式处理错误

不带
的函数只会向您返回一个错误。您需要知道错误的类型,并根据您的类型处理它。查看
广播/3
功能(不带
):

它只调用给定的服务器并返回其结果。
广播/3
函数将执行相同的操作,但是:它将调用
广播
函数而不调用
,将检查其结果并提高
广播错误


你基本上是对的,马克——如果事情出了差错,说“确实会出错”是一种惯例

关于这一点,有一些文档谈到了文件访问
(向下滚动到短语training bang)

这只是一种命名约定。看看这个答案-

!-如果函数遇到错误,将引发异常


一个很好的例子是Enum.fetch!(它还有一个相同的Enum.fetch,它不会引发异常)。在给定索引处查找元素(从零开始)。如果给定位置超出集合范围,则引发边界外错误。

感谢您找到我一直在这里寻找的参考资料。我曾希望你所链接的内容会有一些官方文件的参考资料,但我想这是必须的。我来自一个充满PEP文章的python世界,在那里,有超过两段专门讨论“为什么”,所以我有点失望,因为没有相同的公共思考过程,但这将不得不这样做。很高兴提供帮助,而且elixir是新的,每天都在改进,包括文档。因此,我认为这些文档很快就会达到预期的水平。我仍然非常感谢您指出的来源,但是,现在(回头看)我将正确答案移到了@0xAX,因为我强调了函数的双版本。我希望你同意这个决定。感谢你花时间从凤凰城的源头上提供一个很好的例子。它完美地回答了我的问题。我被夹在你的答案和我选择的答案之间,因为两者都很好地解释了我的问题。我之所以选择不选这个,仅仅是因为它关注的是菲尼克斯对
的使用很遗憾,我的问题中没有提到,我对长生不老药的习俗比对凤凰城更感兴趣。我要收回我自己的话,接受你的回答,因为它指出了@MoxleyStratton提到的一个重要细节-“bang约定适用于函数有两个版本的情况——一个引发异常(bang版本),另一个不引发异常。“我的主要问题是,这些文档是顺便制作的,作为长生不老药社区,我们希望抓住其中的微妙之处。我很高兴我能收集到一些东西,而且你提供了它的公认用途的
社区文档:)我发现这个答案有误导性。通过阅读,开发人员可以得出这样的结论:当创建一个引发错误的函数时,应该使用bang(!)来命名它。这不是爆炸大会的目的@0xAX正确地指出,在看到一个bang函数时,“这意味着可能有一个函数具有相同的名称,但没有!符号”。bang约定适用于函数有两个版本的情况——一个引发异常(bang版本),另一个不引发异常。@moxlystraton回顾这个问题(和接受的答案),我同意你(也不同意我过去的决定)。
Notice that when the file does not exist, the version with ! raises an
error. The version without ! is preferred when you want to handle
different outcomes using pattern matching...
  def broadcast(server, topic, message) when is_atom(server),
    do: call(server, :broadcast, [:none, topic, message])
  def broadcast!(server, topic, message) do
    case broadcast(server, topic, message) do
      :ok -> :ok
      {:error, reason} -> raise BroadcastError, message: reason
    end
  end