假定要在一个方法中返回多个值。比如需要返回一个人的名、姓和邮箱地址。在Java中最常用的方法是定义一个Person类,其中包括相对应的字段;还有些不常用的方法就是返回一个集合或数组,拿到结果后再进行循环取值。在Scala中我们又多一个选择:元组。

元组是一个不可变的对象序列,可以使用逗号分隔的值进行创建,比如这个有3个对象的元组:(“robin”, “zhang”, “robin@zhyea.com”)。

元组的一个特性就是多重赋值,就是可以将元组中的元素赋值给多个val或var。

下面是一个例子:

def getPersonInfo (primaryKey: Int) = {//假设使用primaryKey获取用户信息//这里的返回值被硬编码了("robin", "zhang", "robin@zhyea.com")
}val (firstName, lastName, email) = getPersonInfo (1);println ("firstName: " + firstName)
println ("lastName: " + lastName)
println ("email: " + email)

再来看一下执行结果:

多重赋值成功了。注释中的“硬编码”是什么意思在百度后知道了:硬编码是指将可变变量用一个固定值来代替的方法。还有一点就是getPersonInfo方法中返回结果没有使用return,这也是scala支持的一个特性:在scala中的方法中将最后出现的变量作为return的值。要使用return必须显示指定返回类型,从而使scala失去推断返回值类型的能力。必须使用return意味着存在“多路径返回”的问题,需要借助return的中断返回的特性来处理多分支问题。在scala中不鼓励使用return。

如果尝试将方法返回结果赋值给数量不一致的变量scala就会报错,如果是在编译代码而不是作为脚本执行,那么在编译期间就会报错。

将代码调整成这样:

def getPersonInfo (primaryKey: Int) = {//假设使用primaryKey获取用户信息//这里的返回值被硬编码了("robin", "zhang", "robin@zhyea.com")
}val (firstName, lastName) = getPersonInfo (1);println ("firstName: " + firstName)
println ("lastName: " + lastName)

执行后报错了:

不赋值的话也可以使用索引来访问元组中的元素,像这样:

val info = getPersonInfo (1);println ("firstName: " + info._1)
println ("lastName: " + info._2)
println ("email: " + info._3)

元组不仅仅对多重赋值中有用。在并发编程里,使用元组可以把一组数据值作为消息在Actor之间传递(它们不变的属性刚好在这里派得上用场)。这一点先记下来。

scala的元组还有一个特性,就是元组中的值可以是不同类型。稍稍调整了下之前的代码:

def getPersonInfo (primaryKey: Int) = {//假设使用primaryKey获取用户信息//这里的返回值被硬编码了("robin", "zhang", 29, "robin@zhyea.com")
}val info = getPersonInfo (1);println ("firstName: " + info._1)
println ("lastName: " + info._2)
println ("age: " + info._3)
println ("email: " + info._4)

再来看一下执行结果:

就这样。

转载于:https://www.cnblogs.com/amunote/p/5559867.html

scala学习手记5 - 元组与多重赋值相关推荐

  1. scala学习手记34 - trait方法的延迟绑定

    trait的方法的延迟绑定就是先混入的trait的方法会后调用.这一点从上一节的实例中也可以看出来. 下面再来看一个类似的例子: abstract class Writer {def write(me ...

  2. scala学习手记2 - scala中的循环

    先来看一段Java中的循环: for (int i = 1; i < 4; i++) {System.out.print(i + ","); } 毫无疑问,scala可以让这 ...

  3. scala学习手记25 - Curry化

    curry翻译为中文就是咖喱.意为使用curry可以让代码更有味道. scala里的curry化可以把函数从接收多个参数转换成接收多个参数列表.也就是说我们要编写的函数不是只有一个参数列表,这个参数列 ...

  4. scala学习手记26 - 重用函数值

    函数值对消除代码重复有很大的帮助.但是像函数值这样直接将一个函数作为另一个函数的参数却不太利于函数值本身的重用. 来看一个例子: class Equipment(val routine: Int =& ...

  5. scala学习手记28 - Execute Around模式

    我们访问资源需要关注对资源的锁定.对资源的申请和释放,还有考虑可能遇到的各种异常.这些事项本身与代码的逻辑操作无关,但我们不能遗漏.也就是说进入方法时获取资源,退出方法时释放资源.这种处理就进入了Ex ...

  6. (译)用多重赋值和元组解包提高python代码的可读性

    原文链接(侵删): http://treyhunner.com/2018/03/tuple-unpacking-improves-python-code-readability/ 无论我是教pytho ...

  7. Scala学习--《Scala编程》

    2019独角兽企业重金招聘Python工程师标准>>> Scala学习手册--可伸缩的语言(随着使用者的需求而成长)  第一章:基本概念 Scala=FP+OO.静态语言 兼容性.简 ...

  8. Scala学习笔记(黑马视频)

    目录 2.Scala第二章节 2.1 输出语句和分号 2.1.1 输出语句 2.1.2 分号 2.2 Scala中的常量 2.2.1 概述 2.2.2 分类 2.2.3 代码演示 2.3. Scala ...

  9. Scala学习笔记(三)

    Scala学习笔记(三) 一.模式匹配 1. 简单模式匹配 2. 匹配类型 3. 守卫 4. 匹配样例类 5. 匹配数组 6. 匹配列表 7. 匹配元组 8. 变量声明中的模式匹配 8.1 获取数组中 ...

最新文章

  1. SAP MM 物料成本价格修改历史的查询
  2. 金审系统与SAP接口
  3. 3.Linux 文件的压缩与打包
  4. 中标麒麟桌面版yum安装mysql_中标麒麟Neokylin6桌面版如何本地yum安装软件
  5. 关于浮点数的原理详解
  6. Docker环境下:ImportError: libSM.so.6: cannot open shared object file: No such file or directory
  7. SMO写的查看数据库信息的代码
  8. oracle中的存储过程教程,oracle 存储过程
  9. 大数据的乘法实现——C语言
  10. Python爬取B站弹幕+Gephi梳理主线剧情
  11. Angular4.X 介绍
  12. 不确定性原理的前世今生 · 数学篇(二)
  13. linux打开mid格式音乐,mid文件扩展名,mid文件怎么打开?
  14. CPDA项目数据分析师和CDA数据分析师有什么区别?
  15. 数据结构保研面试题整理(自用)
  16. js获取屏幕宽度方法大全
  17. 博士申请 | 美国埃默里大学招收2022秋季入学机器学习方向全奖博士生
  18. M26 SDK开发环境搭建
  19. 假事务之名,深入研究UNDO与REDO
  20. UI导航栏设计规范及注意事项有哪些?

热门文章

  1. HTML5个人求职简历模板下载
  2. oracle层级计算推演,云和恩墨的两道Oracle面试题
  3. mysql是什么1001mysql是什么_mysql深入理解
  4. java中一个数小于零_这段java程序怎样才能让“所输入的数小于0!”只输出一次,并且满足题目条件?...
  5. axios config里自定义属性,使用拦截器拦截,无法拿到自定义属性问题
  6. 企业级Java开发树结构数据封装(开发必用)
  7. 当心XML文件中的非法字符
  8. CodeSmith实用技巧(九):重载Render方法来控制输出
  9. 用户控件事件使用delegate
  10. 视差滚动不适合网页的5个原因