假定要在一个方法中返回多个值。比如需要返回一个人的名、姓和邮箱地址。在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 - 元组与多重赋值的更多相关文章

  1. scala学习手记17 - 容器和类型推断

    关于scala的类型推断前面已经提到过多次.再来看一下下面这个例子: import java.util._ var list1: List[Int] = new ArrayList[Int] var ...

  2. Scala学习手记1 - 快速体验

    又重新开始了scala的学习,因为中断了太长时间,所以这次还得从零开始.学习的过程就记录在这个博客上了. 这次学习的教程是<scala程序设计 java虚拟机多核编程实战>,我在多看上买了 ...

  3. scala 学习笔记(02) 元组Tuple、数组Array、Map、文件读写、网页抓取示例

    package yjmyzz import java.io.PrintWriter import java.util.Date import scala.io.Source object ScalaA ...

  4. Scala学习——数组/映射/元组

    [<快学Scala>笔记] 数组 / 映射 / 元组 一.数组 1.定长数组 声明数组的两种形式: 声明指定长度的数组 val 数组名= new Array[类型](数组长度) 提供数组初 ...

  5. scala学习手记39 - 模式匹配

    在java中有switch/case这样的模式匹配语句,可以匹配的类型包括int,byte,char,short, enum,在java8又支持了字符串. 在scala中也有类似的模式匹配语句,即ma ...

  6. scala学习手记38 - 方法命名约定和for表达式

    方法命名约定 之前在学习<运算符重载>一节时曾经说过一个方法命名约定:方法的第一个字符决定了方法的优先级.现在再说另一个命名约定:如果方法以冒号(:)结尾,则调用目标是运算符后面的实例. ...

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

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

  8. scala学习手记23 - 函数值

    scala的一个最主要的特性就是支持函数编程.函数是函数编程中的一等公民:函数可以作为参数传递给其他函数,可以作为其他函数的返回值,甚至可以在其它函数中嵌套.这些高阶函数称为函数值. 举一个简单的例子 ...

  9. scala学习手记22 - 参数化类型的可变性

    java 的代码中多少有些不是很严谨的内容,比如下面的这段代码: public class Trouble { public static void main(String[] args) { Int ...

随机推荐

  1. Spring Context及ApplicationContext

    web.xml 这是声明了一个父工厂 <context-param> <param-name>contextConfigLocation</param-name> ...

  2. 推流协议 支持RTMP协议推流

    Stream Type Stream play domain nameStreaming Domain Name   播流 推流  推流协议 支持RTMP协议推流

  3. .net ASPxTreeList 使用手记

    ASPxTreeList在使用ASPxGridViewExporter控件做导出时,如果指定文件名是中文时会乱码可以用以下方法解决: grvExporter为ASPxGridViewExporter控 ...

  4. Python生成器是什么

    生成器是 Python 初级开发者最难理解的概念之一,虽被认为是 Python 编程中的高级技能,但在各种项目中可以随处见到生成器的身影,你得去理解它.使用它.甚至爱上它. 提到生成器,总不可避免地要 ...

  5. 注册tomcat为windows服务(转载)

    第一部分 应用场景 需要服务器上Tomcat不显示启动窗口 需要服务器上Tomcat开机自启动 ... 第二部分 配置过程 一.修改配置文件 1 {Tomcat_HOME}/bin/service.b ...

  6. IOS JAVA PHP 安卓 通用加密方式

    PHP代码: class Aes { private $hex_iv = '00000000000000000000000000000000'; // converted JAVA byte code ...

  7. 超过两行显示省略号 -webkit-line-clamp、-webkit-box-orient vue打包后不起作用

    为了实现两行显示缩略显示,但是本地是可以显示,打包后不起作用 word-break: break-all; text-overflow: ellipsis; display: -webkit-box; ...

  8. numpy.linspace介绍

    numpy.linspace:在指定范围内返回均匀间隔的数组 In [12]: import numpy as np In [13]: result = np.linspace(1,10) #默认生成 ...

  9. LCT(link cut tree) 动态树

    模板参考:https://blog.csdn.net/saramanda/article/details/55253627 综合各位大大博客后整理的模板: #include<iostream&g ...

  10. js验证真实姓名

    var regName = /^[\u4e00-\u9fa5]{2,4}$/; if (!regName.test(examinee.name)) { wx.showToast({ title: &q ...