第一种形式(不推荐):
第一种定义形式:
def sum(x: Int)(y: Int)(z: Int) = x + y + z这种定义形式和Java、C、C#都不一样,而且Scala的这种函数定义也不多见,同时用的时候比较容易和第二种定义形式的用法混淆。
第二种形式:
这种形式是常用的,推荐使用这种形式。
val signal: PartialFunction[Int, Int] = { case x if x > 1 => 1 case x if x < -1 => -1 }这个signal所引用的函数除了0值外,对所有整数都定义了相应的操作。 signal(0) 会抛出异常,因此使用前最好先signal.isDefinedAt(0)判断一下。 偏函数主要用于这样一种场景:对某些值现在还无法给出具体的操作(即需求还不明朗),也有可能存在几种处理方式(视乎具体的需求);我们可以先对需求明确的部分进行定义,比如上述除了0外的所有整数域,然后根据具体情况补充对其他域的定义,如:
val composed_signal: PartialFunction[Int,Int] = signal.orElse{ case 0 => 0 } composed_signal(0) // 返回 0或者对定义域进行一定的偏移(假如需求做了变更, 1 为无效的点),如:
val new_signal: Function1[Int, Int] = signal.compose{ case x => x - 1 } new_signal(1) // throw exception new_signal(0) // 返回 -1 new_signal(2) // 返回 1还可以用andThen将两个相关的偏函数串接起来。
val another_signal: PartialFunction[Int, Int] = { case 0 => 0 case x if x > 0 => x - 1 case x if x < 0 => x + 1 } val then_signal = another_signal andThen signal这里的then_signal 剔除了-1, 0, 1三个点的定义。
http://www.verydemo.com/demo_c161_i51144.html
《Scala编程》
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/u010376788/article/details/47206571