2016-05-15 11 views
1

は、関数定義でデフォルト引数を使用することが可能であるが、私はそれは不可能のような単一キーワードリストの引数で、そうすることが分かっ:またエリクサー、エリキシルでデフォルトキーワードリスト引数

def do_stuff(
    success: sucess \\ fn(conn) -> conn end, 
    error: error 
) do 
    # ... 
end 

、私はこれを回避することについて考えましたJSの約束のようなものを使って、ある種の "コールバックパッシング"スタイルのコーディングをしていましたが、私はElixirの約束の実装を見つけることができませんでした。

私はより良いコードを書いて、エリキシル基準にもっと近づくのを助けるかもしれない言語の中に組み込まれたものがあるかもしれません。

メイン質問:デフォルトのキーワード引数を使用できますか?

サイド質問:この「コールバックパッシング」スタイルのプログラミングを避けるために、より反応性の高い/構成可能なメカニズムを提供するためのエリクサーがありますか?

答えて

5

いいえ、それはキーワード引数は、単一のキーワードリストの上にだけ糖衣構文であるため、デフォルトのキーワード引数を使用することはできません。

do_stuff(success: ..., failure: ...) 

do_stuff([success: ..., failure: ...]) 

と同じであるので、キーワードリストがされます本当にただ一つの議論です。あなたの関数定義で何をしているのかと一致するキーワードリストはdo_stuff/1に渡されます:キーワードの順序が同じでないと、関数の定義が一致しないので、これも注意してください。 、do_stuff(failure: ..., success: ...))。

私はこれを克服するための良い方法は、単にdo_stuff機能のための2つの異なる引数を使用していると思う:予想通り、デフォルトの引数は作業

def do_stuff(success \\ fn(conn) -> conn end, failure \\ fn(err) -> err end) 

この方法です。あなたが本当にキーワードリストであるためにあなたの引数を必要とする場合は、関数の本体内のデフォルト値を処理できます

def do_stuff(options) do 
    success = options[:success] || (fn(conn) -> conn end) 
    failure = options[:failure] || (fn(err) -> err end) 
end 

最後に、あなたが言及した「コールバックスタイル」について、私はそれについては何も知りません同時実行とメッセージの受け渡しを調べ始める場合を除いて、何かが行われたときにはfnを渡すだけとは大きく異なります。