2013-01-19 99 views
2

嗨,我正在通过Fred Hebert学习一些Erlang来学习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检查,如果这些功能都是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(#)为什么sword(#)看起来好像有一个1(我正在计算数字参数作为参数)?

The chapter of the book I'm at.

谢谢您的时间。

回答

1
  1. 如果你看一下为black_knight功能,is_function(Attack, 0)保护声明,它只会如果传入的函数接受0参数相匹配的定义。由于talk需要0个参数,它可以直接传入。 sword需要一个参数,因此您需要将其包装在一个匿名函数中,然后才能将其传入。
  2. 每个子句的定义中的数字都是模式匹配的示例。如果您致电sword并以1作为参数,则将执行条款sword(1) ->中的代码。如果您通过2作为参数,您将执行条款sword(2) ->。请参阅this section了解更多有关Erlang的更完整说明。
  3. sword确实有一个1,因此您正确计数参数。
1

sword函数的作用是展示可抛出的各种错误。它接受一个参数,所以它可以有多个子句。弗雷德可能选择了整数,因为它们很短,但这并不重要。 sword函数真的有一个。

black_knight/1函数应该向您展示如何捕获Erlang中存在的不同错误类。它通过调用传入它的零元函数来完成此操作,并为它可能抛出的不同错误提供不同的响应。

sword/1使用匿名函数 因为black_knight/1只接受元数为零的函数传递到black_knight/1。 由

fun() -> sword(1) end 

创建匿名函数参数数量为零调用sword/1有一个参数的函数。

talk/0可以直接传递,因为它已经是零元函数了。