2

こんにちは私はFredHebertによるLearnYouSomeErlangを介してErlangを学んでいます。

そして、私が混乱しているコードに出くわしました:

sword(1) -> throw(slice);
sword(2) -> erlang:error(cut_arm);
sword(3) -> exit(cut_leg);
sword(4) -> throw(punch);
sword(5) -> exit(cross_bridge).

talk() -> "blah blah".

black_knight(Attack) when is_function(Attack, 0) ->
    try Attack() of
        _ -> "None shall pass."
    catch
        throw:slice -> "It is but a scratch.";
        error:cut_arm -> "I've had worse.";
        exit:cut_leg -> "Come on you pansy!";
        _:_ -> "Just a flesh wound."
    end.

だからここに混乱があります。機能がわかりませんsword(#)。パラメータとして数値があるのはなぜですか?関数is_functionは実際にこれらの関数がアリティ0であるかどうかをチェックし、明らかにすべてのsword(#)関数がアリティ0であるかどうかを確認します。

sword(#)また、関数を関数に渡す方法は、black_knight関数とは異なりtalkます。

swordこの本が関数と関数を渡す方法は次のとおりtalkです。

exceptions:black_knight(fun exceptions:talk/0).

vs

exceptions:black_knight(fun() -> exceptions:sword(1) end).

talk関数を渡すだけですが、関数として無名sword(1)関数でラップする必要があります。理解できません。

したがって、質問は次のとおりです。

  1. なぜこれらを関数とはsword(#)異なるものとして渡すのですか。talk
  2. なぜsword(#)パラメータとして数値を持っているのですか?
  3. sword(#)アリティが1のように見えるのになぜアリティが0になるのですか(数値パラメーターをパラメーターとして数えています)?

私がいる本の章。

お時間をいただきありがとうございます。

4

2 に答える 2

1
  1. black_knight関数のguardステートメントを見ると、is_function(Attack, 0)渡された関数が0個のパラメーターを受け取る場合にのみ定義と一致します。talkは0個のパラメーターを受け取るため、直接渡すことができます。 sword1つのパラメーターを受け取るため、渡す前に0個のパラメーターを受け取る無名関数でラップする必要があります。
  2. 各句の定義にある数字は、パターンマッチングの例です。sword引数としてwithを呼び出す場合1は、句のコードを実行しますsword(1) ->。引数として渡すと2、句が実行されますsword(2) ->。詳細については、Learn YouSomeErlangのこのセクションを参照してください。
  3. swordアリティは1なので、パラメータを正しくカウントしていました。
于 2013-01-20T01:35:17.737 に答える
1

この関数の目的は、swordスローされる可能性のあるさまざまな種類のエラーを表示することです。パラメータを受け入れるため、複数の句を含めることができます。フレッドは整数が短いのでおそらく整数を選びましたが、それは実際には問題ではありません。このsword関数には、実際には1つのアリティがあります。

このblack_knight/1関数は、Erlangに存在するさまざまなエラークラスをキャッチする方法を示すことになっています。これは、渡されたゼロアリティ関数を呼び出し、スローされる可能性のあるさまざまなエラーに対してさまざまな応答を提供することによって行われます。

sword/1アリティゼロの関数のみを受け入れるためblack_knight/1、無名関数の使用に 渡されます。によって作成される無名関数 black_knight/1

fun () -> sword(1) end

sword/1は、 1つの引数で呼び出すアリティゼロの関数です。

talk/0すでにゼロアリティ関数であるため、直接渡すことができます。

于 2013-01-20T01:37:50.907 に答える