嗨,我正在通过 Fred Hebert 的 Learn You Some Erlang 学习 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
实际上检查这些函数是否是 arity 0 并且显然所有sword(#)
函数都是 arity 0。
与函数相比,将函数传递sword(#)
给black_knight
函数的方式也不同talk
。
下面是这本书如何传递一个sword
函数和talk
函数。
exceptions:black_knight(fun exceptions:talk/0).
对比
exceptions:black_knight(fun() -> exceptions:sword(1) end).
我们talk
只传递函数作为sword(1)
函数,我们必须用匿名函数包装它。我不明白。
所以问题是:
- 为什么传递这些
sword(#)
与talk
函数不同。 - 为什么
sword(#)
有一个数字作为参数? - 为什么
sword(#)
当它的 arity 看起来像 1 时有 0 arity(我将 number 参数作为参数计算)?
感谢您的时间。