こんにちは私は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)
関数でラップする必要があります。理解できません。
したがって、質問は次のとおりです。
- なぜこれらを関数とは
sword(#)
異なるものとして渡すのですか。talk
- なぜ
sword(#)
パラメータとして数値を持っているのですか? sword(#)
アリティが1のように見えるのになぜアリティが0になるのですか(数値パラメーターをパラメーターとして数えています)?
お時間をいただきありがとうございます。