美文网首页
case语句与偏函数(转)

case语句与偏函数(转)

作者: felix_feng | 来源:发表于2016-08-05 14:51 被阅读55次

Scala通过case语句提供了形式简单、功能强大的模式匹配功能。但是也许你不知道,Scala还具有一个与case语句相关的语言特性,那就是:在Scala中,被“{}”包含的一系列case语句可以被看成是一个函数字面量,它可以被用在任何普通的函数字面量适用的地方,例如被当做参数传递。

看懂了以上的代码,我们就不难理解在Scala的Actor中经常使用的react函数的语法形式:

react {

case (name: String, actor: Actor) => {

actor ! getip(name)

act()

}

case msg => {

println("Unhandled message: "+ msg)

act()

}

}

在Scala中,偏函数是具有类型PartialFunction[-A,+B]的一种函数。A是其接受的函数类型,B是其返回的结果类型。偏函数最大的特点就是它只接受和处理其参数定义域的一个子集,而对于这个子集之外的参数则抛出运行时异常。这与Case语句的特性非常契合,因为我们在使用case语句是,常常是匹配一组具体的模式,最后用“_”来代表剩余的模式。如果一一组case语句没有涵盖所有的情况,那么这组case语句就可以被看做是一个偏函数。

val second:PartialFunction[List[Int],Int] = {case List(x::y::_) => y}

second函数的功能是返回一个List[Int]中的第二个值。case函数体只涵盖了当一个List的长度大于2的情况,而忽略Nil和长度为1的列表。

scala> val b = sum(1, _: Int,3)

b: (Int) => Int = < function>

scala> b(2)

res15: Int =6

Tips:一组case语句要成为一个偏函数,那么它被赋予的变量必须被声明为PartionFunction[-A,+B]

那么我们什么时候该使用偏函数?或者说偏函数给我们带来了什么好处?当我们确定我们的程序不会被传入不可处理的值时,我们就可以使用偏函数。这样万一程序被传入了不应该被传入的值,程序自动抛出异常,而不需要我们手工编写代码去抛出异常,减少了我们的代码量。

相关文章

  • case语句与偏函数(转)

    Scala通过case语句提供了形式简单、功能强大的模式匹配功能。但是也许你不知道,Scala还具有一个与case...

  • 黑猴子的家:mysql 流程控制函数

    流程控制函数 1、if函数 2、case语句一 案例 3、case语句二 案例:查询部门和对应的级别

  • Scala学习笔记七——偏函数

    偏函数和一般函数的区别在与偏函数并不是处理所有的输入,而仅仅只处理与至少一个case匹配的输入。 偏函数的定义有一...

  • scala-偏函数

    将包在大括号内的一组case语句封装为函数,称之为偏函数。partialFunction 是一个特质 为什么使用使...

  • 【MySql】- CASE WHEN

    MySql 触发器里的流程控制语句: CASE WHEN CASE WHEN 语法有两种: 简单函数。CASE [...

  • 常见函数

    switch-case语句: 多重if语句: 分组函数:image.png distinct去重:image.pn...

  • Scala 模式匹配的常见类型

    常量模式与变量模式 功能类似于其他语言的switch语句,但是在match case语句中是可以使用函数,也就意味...

  • 06_SHELL编程之CASE语句+函数+正则

    课程目标 掌握case语句的基本语法结构 掌握函数的定义及调用 掌握常用的正则表达式元字符含义 一、case语句 ...

  • python语言模拟switch-case语句

    python语言的if语句如下: 采用lambda的匿名函数,提供类似switch-case语句 采用上述编码,如...

  • SQL存储过程和函数(2)

    存储过程和函数中可以使用流程控制来控制语句的执行。MySQL中可以使用IF语句、CASE语句、LOOP语句、LEA...

网友评论

      本文标题: case语句与偏函数(转)

      本文链接:https://www.haomeiwen.com/subject/uuihsttx.html