2015-10-24 4 views
18

は、私が最初に末尾のエクスクラメーションマーク/バン(!)(Incoming Eventsセクションで)フェニックスのチュートリアルを通過しながら、エリクシル・バン・ファンクションとは何ですか?

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

末尾の感嘆符はどういう意味を持つ関数に気づきましたか?それは何かをしますか?私は周りを探索していましたが、私は正しい言葉を使っているかどうかはわかりません。これまでのところ、この関数は慣習としてのみ失敗するとエラーを発生させますが、常にそうであるように見えます。

ザ・のみ、私はデイブ・トーマスによって「プログラミングエリクシール」に表示され、それを参照して言及:

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. 

the documentationで、それは言及:これがある場合は、これらの

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

どちらが説明他のエリクリストや錬金術師、あるいは何でも使用できます。助けてください。

答えて

10

この:ファイルが存在しないことを

お知らせ、とバージョン! エラーが発生します。無しのバージョン!パターン一致を使用して 異なる結果を処理したい場合は、...

は、ソースコードを見るとより明確になります。関数名の記号!は構文上の合意に過ぎません。その名前に!シンボルが含まれている関数が表示された場合は、同じ名前の関数がありますが、!シンボルがない可能性が高いことを意味します。これらの関数はどちらも同じことを行いますが、異なる方法でエラーを処理します。

!の機能がないと、エラーが返されます。あなたはエラーの種類を知り、あなたのタイプに応じてそれを処理する必要があります。 broadcast/3機能(!なしvariant)に見て:

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

それだけで特定のサーバーへの呼び出しを行い、その結果を返します。 broadcast!/3関数が同じことをするでしょう、しかし:それは!なしbroadcast関数を呼び出します、その結果をチェックしてBroadcastErrorexceptionが発生します:

def broadcast!(server, topic, message) do 
    case broadcast(server, topic, message) do 
     :ok -> :ok 
     {:error, reason} -> raise BroadcastError, message: reason 
    end 
    end 
+0

フェニックスの出身の良い例を提供してくれてありがとう。それは私の質問に完全に答えます。私はあなたの答えと私が選んだものの間に詰まっていました。私は、私はエリクサー規則フェニックスよりもいくらかに興味がある、それは残念ながら私の質問では発現していない '!'と、フェニックスの使用に焦点を当てたという理由だけで、このいずれかを選択しないことを選びました。 – Marc

+1

私は自分の言葉を食べるつもりです - そして、@MoxleyStrattonが述べたように重要な詳細を指しているので、あなたの答えを受け入れます - "ファンクションの2つのバージョンがある - (バングバージョン)、そうでないもの " – Marc

2

あなたは基本的には右のマークを得た - RAISEないと言うための規則です物事が間違っている場合のエラー。

ファイルアクセス (強打末尾のフレーズまでスクロール)ちょうど命名規則

+0

私の主な問題は、ドキュメンテーションが合格で作られていることです。私たちはエリクシールコミュニティが微妙なことをすると予想しています。私は何かを集めることができてうれしく思いました。あなたは受け入れられた使用の「コミュニティ文書」を提供しました:) TY – Marc

+0

私はこの答えが誤解を招くことがわかりました。それを読んで、開発者は、エラーを発生させる関数を作成するときは、bang(!)という名前を付けなければならないと結論づけることができます。これは、大会規約の意図ではありません。 @ 0xAXは、 "同じ名前の関数がある可能性が高いことを意味しますが、シンボルはありません"というbang関数を見たときに正しく機能しました。 bang規約は、関数の2つのバージョン(例外を発生させるバージョン(bangバージョン)とそうでないバージョン)がある状況に適用されます。 –

+0

@MoxleyStrattonはこの質問を振り返ります(そして受け入れられた答え)私はあなたに同意します(私の過去の決定に同意しません)。 – Marc

11

その語るこのpageの種類のドキュメントは、あります。この回答を確認してください - What's the meaning of "!", "?", "_", and "." syntax in elixir

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

良い例の1つがEnum.fetchです(これには例外を発生させない同じEnum.fetchもあります)。指定されたインデックス(ゼロから始まる)で要素を検索します。指定された位置がコレクションの範囲外にある場合はOutOfBoundsErrorを送出します。

+0

私がここで探していた参照を見つけていただきありがとうございます。私は、あなたがリンクしていたものは、公式の文書への参照があることを期待していたが、それはしなければならないと思う。私は、PEPの記事や、このような場所のカップルの段落は、「なぜだ」、私は同じ公共の思考プロセスが利用できないことを少しがっかりしてるに専用されている以上、この意志の完全なPythonの世界から来ていますしなければなりません。 – Marc

+0

喜んでお手伝いします。また、エリクサーは新しいものであり、毎日改善しています。だから私はドキュメントはすぐにそれらの期待レベルに達すると思う。 – coderVishal

+1

私はあなたが指摘したソースにはまだ非常に感謝しています。しかし、今では(逆を見て)私は関数のデュアルバージョンに重点を置いているため、正しい答えを@ 0xAXに移動しました。あなたがその決定に同意したことを願っています。 – Marc

関連する問題