什么是Elixir Bang功能?

Mar*_*arc 28 elixir phoenix-framework

我首先注意到一个带有尾随感叹号/爆炸(!)的函数,同时浏览Phoenix教程(在Incoming Events部分)

def handle_in("new_msg", %{"body" => body}, socket) do
    broadcast! socket, "new_msg", %{body: body}
    {:noreply, socket}
end
Run Code Online (Sandbox Code Playgroud)

尾随感叹号是什么意思?它有什么用吗?我一直在寻找并尝试寻找,但我不确定我是否使用了正确的条款.到目前为止,似乎只有作为约定的函数会在失败时引发错误,但总是意味着它总是意味着.

我看到它的唯一提及出现在Dave Thomas的"Programming Elixir"中:

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.
Run Code Online (Sandbox Code Playgroud)

而且在文档它提到:

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...
Run Code Online (Sandbox Code Playgroud)

这些都没有解释这是否是其他灵药师或炼金术士或其他任何使用的惯例.请帮忙.

0xA*_*xAX 24

这个:

请注意,当文件不存在时,版本带!引发错误.没有版本!当你想使用模式匹配处理不同的结果时,首选...

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

没有的功能!只会给你一个错误.您需要知道一种错误并根据您的类型进行处理.查看broadcast/3函数(不带变量!):

  def broadcast(server, topic, message) when is_atom(server),
    do: call(server, :broadcast, [:none, topic, message])
Run Code Online (Sandbox Code Playgroud)

它只是调用给定的服务器并返回其结果.该broadcast!/3函数将执行相同的操作,但是:它将调用broadcast函数!,不会检查其结果并引发BroadcastError 异常:

  def broadcast!(server, topic, message) do
    case broadcast(server, topic, message) do
      :ok -> :ok
      {:error, reason} -> raise BroadcastError, message: reason
    end
  end
Run Code Online (Sandbox Code Playgroud)


cod*_*hal 16

它只是一个命名惯例.检查这个答案 - "!","?","_"和"."的含义是什么.elixir中的语法

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

一个很好的例子是Enum.fetch!(它也有一个相同的Enum.fetch,它不会引发异常).在给定的索引处绑定元素(从零开始).如果给定位置超出集合范围,则引发OutOfBoundsError.