web-dev-qa-db-ja.com

エリクサーバング機能とは何ですか?

私は最初に、フェニックスのチュートリアル( Incoming Events セクション)を実行しているときに、末尾に感嘆符/ bang(!)が付いている関数に気づきました

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

末尾の感嘆符はどういう意味ですか?それは何かしますか?私は周りを検索して探してみましたが、正しい用語を使用しているのかわかりません。これまでのところ、慣例としての関数は失敗した場合にエラーが発生するようですが、常にそうなることを意味します。

私が見た唯一の言及は、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.

そして ドキュメント にも言及しています:

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...

これらのどちらも、これが他のエリキシリストや錬金術師などが使用する慣習であるかどうかを説明していません。助けてください。

30
Marc

この:

ファイルが存在しない場合は、バージョンが!エラーが発生します。なしバージョン!パターンマッチングを使用してさまざまな結果を処理する場合に推奨されます...

ソースコードを見ると、より明確になります。関数名の!記号は、単なる構文上の合意です。名前に!記号が含まれている関数がある場合、同じ名前で!記号のない関数が存在する可能性があります。これらの関数はどちらも同じことを行いますが、エラーの処理方法は異なります。

!のない関数は、エラーを返します。エラーのタイプを把握し、タイプに応じて処理する必要があります。 broadcast/3関数を見てください( variant なしで!):

  def broadcast(server, topic, message) when is_atom(server),
    do: call(server, :broadcast, [:none, topic, message])

指定されたサーバーを呼び出すだけで、その結果を返します。 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
23
0xAX

その単なる命名規則。この回答を確認してください- 「!」、「?」、「_」、および「。」構文の意味は何ですかelixir

! -関数でエラーが発生した場合、例外が発生します。

良い例の1つはEnum.fetch!です(例外も発生しない同じEnum.fetchもあります)。指定されたインデックス(ゼロベース)で要素を見つけます。指定された位置がコレクションの範囲外の場合、OutOfBoundsErrorを発生させます。

15
coderVishal

あなたは基本的にそれを正しくマークしています-物事がうまくいかない場合はエラーを発生させてくださいと言うのが慣習です。

これには一種のドキュメントがあります ページ ファイルアクセスについて説明しています(下にスクロールしてフレーズtrailing bang

2
GavinBrelstaff