scala学习手记5 - 元组与多重赋值
假定要在一个方法中返回多个值。比如需要返回一个人的名、姓和邮箱地址。在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)
再来看一下执行结果:

就这样。
scala学习手记5 - 元组与多重赋值的更多相关文章
- scala学习手记17 - 容器和类型推断
关于scala的类型推断前面已经提到过多次.再来看一下下面这个例子: import java.util._ var list1: List[Int] = new ArrayList[Int] var ...
- Scala学习手记1 - 快速体验
又重新开始了scala的学习,因为中断了太长时间,所以这次还得从零开始.学习的过程就记录在这个博客上了. 这次学习的教程是<scala程序设计 java虚拟机多核编程实战>,我在多看上买了 ...
- scala 学习笔记(02) 元组Tuple、数组Array、Map、文件读写、网页抓取示例
package yjmyzz import java.io.PrintWriter import java.util.Date import scala.io.Source object ScalaA ...
- Scala学习——数组/映射/元组
[<快学Scala>笔记] 数组 / 映射 / 元组 一.数组 1.定长数组 声明数组的两种形式: 声明指定长度的数组 val 数组名= new Array[类型](数组长度) 提供数组初 ...
- scala学习手记39 - 模式匹配
在java中有switch/case这样的模式匹配语句,可以匹配的类型包括int,byte,char,short, enum,在java8又支持了字符串. 在scala中也有类似的模式匹配语句,即ma ...
- scala学习手记38 - 方法命名约定和for表达式
方法命名约定 之前在学习<运算符重载>一节时曾经说过一个方法命名约定:方法的第一个字符决定了方法的优先级.现在再说另一个命名约定:如果方法以冒号(:)结尾,则调用目标是运算符后面的实例. ...
- scala学习手记34 - trait方法的延迟绑定
trait的方法的延迟绑定就是先混入的trait的方法会后调用.这一点从上一节的实例中也可以看出来. 下面再来看一个类似的例子: abstract class Writer { def write(m ...
- scala学习手记23 - 函数值
scala的一个最主要的特性就是支持函数编程.函数是函数编程中的一等公民:函数可以作为参数传递给其他函数,可以作为其他函数的返回值,甚至可以在其它函数中嵌套.这些高阶函数称为函数值. 举一个简单的例子 ...
- scala学习手记22 - 参数化类型的可变性
java 的代码中多少有些不是很严谨的内容,比如下面的这段代码: public class Trouble { public static void main(String[] args) { Int ...
随机推荐
- iis express worker process已停止工作
以管理员方式运行命令提示符工具,然后执行以下语句 netsh winsock reset 重启电脑
- Apache-ActiveMQ transport XmlMessage
前言 本文原创,转载请说明出处! Apache-ActiveMQ:是Apache提供的一款开源的消息传送服务,不论是安装还是使用都非常简单实用,可以作为消息缓存管理器来使用(个人观点),看看Activ ...
- <2014 04 26> 《Coders at Work编程人生:15位软件先驱访谈录》
什么是老派程序员?调试只用printf,关心数据结构,先整体或先局部,不知道OO.IDE.TDD.BDD等等为何物.Ken Thompson,Jamie Zawinski,Joe Armstrong, ...
- Qt 打印机支持模块
Qt 打印支持 Qt为打印提供广泛的跨平台支持.使用每个平台上的打印系统,Qt应用程序可以打印到连接的打印机,并通过网络打印到远程打印机.Qt的打印系统还支持PDF文件生成,为基本的报告生成设施奠定了 ...
- C++设计模式 -- 解析和实现
原文地址 http://c.chinaitlab.com/special/sjms/Index.html#a 导航目录 ※ 设计模式解析和实现之一-Factory模式 ※ 设计模式解析和实现之八-C ...
- R-CNN for Small Object Detection
R-CNN for Small Object Detection 文章方法概括 这篇文章主要讨论针对小目标的目标检测 文章为了证明:对传统R-CNN style的方法进行改进,可以用于小目标检测,并且 ...
- Ubuntu Linux下通过代理(proxy)使用git上github.com
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/loveaborn/article/details/24575659 github.com.作为程序猿 ...
- Docker 网络之端口绑定
外部访问容器 容器中可以运行一些网络应用,要让外部也可以访问这些应用,可以通过 -P 或 -p 参数来指定端口映射. -P 标记时 Docker 会随机映射一个 49000~49900 的端口到内部容 ...
- Extracts
@1:四层和七层负载均衡的区别:所谓四层负载均衡,也就是主要通过报文中的目标地址和端口,再加上负载均衡设备设置的服务器选择方式,决定最终选择的内部服务器.以常见的TCP为例,负载均衡设备在接收到第一个 ...
- go——并发(二)
通常程序会被编写为一个顺序执行并完成一个独立任务的代码. 如果没有特别的需求,最好总是这样写代码,因为这种类型的程序通常很容易写,也容易维护. 不过也有一些情况下,并行执行多个任务会有更大的好处. 一 ...