Scala可变参数列表,命名参数和参数缺省详解

重复参数 Scala在定义函数时允许指定最后一个参数可以重复(变长参数),从而允许函数调用者使用变长参数列表来调用该函数,Scala中使用“*”来指明该参数为重复参数。例如:

scala> def echo (args: String *) =
   |  for (arg <- args) println(arg)
echo: (args: String*)Unit

scala> echo()

scala> echo ("One")
One

scala> echo ("Hello","World")
Hello
World 

在函数内部,变长参数的类型,实际为一数组,比如上例的String * 类型实际为 Array[String]。 然而,如今你试图直接传入一个数组类型的参数给这个参数,编译器会报错:

scala> val arr= Array("What's","up","doc?")
arr: Array[String] = Array(What's, up, doc?)

scala> echo (arr)
<console>:10: error: type mismatch;
 found  : Array[String]
 required: String
       echo (arr)
          ^ 

为了避免这种情况,你可以通过在变量后面添加 _*来解决,这个符号告诉Scala编译器在传递参数时逐个传入数组的每个元素,而不是数组整体。

scala> echo (arr: _*)
What's
up
doc? 

命名参数 通常情况下,调用函数时,参数传入和函数定义时参数列表一一对应。

scala> def speed(distance: Float, time:Float) :Float = distance/time
speed: (distance: Float, time: Float)Float

scala> speed(100,10)
res0: Float = 10.0 

使用命名参数允许你使用任意顺序传入参数,比如下面的调用:

scala> speed( time=10,distance=100)
res1: Float = 10.0

scala> speed(distance=100,time=10)
res2: Float = 10.0 

缺省参数值 Scala在定义函数时,允许指定参数的缺省值,从而允许在调用函数时不指明该参数,此时该参数使用缺省值。缺省参数通常配合命名参数使用,例如:

scala> def printTime(out:java.io.PrintStream = Console.out, divisor:Int =1 ) =
   | out.println("time = " + System.currentTimeMillis()/divisor)

printTime: (out: java.io.PrintStream, divisor: Int)Unit

scala> printTime()
time = 1383220409463

scala> printTime(divisor=1000)
time = 1383220422 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • scala中的隐式类型转换的实现

    Scala语言中的隐式转换是一个十分强大的语言特性,主要可以起到两个作用: 一.自动进行某些数据类型的隐式转换 String类型是不能自动转换为Int类型的,所以当给一个Int类型的变量或常量赋予String类型的值时编译器将报错.所以,一下语句是错误的. val x: Int = "100" 如果需要将一个字符串类型的整形数值赋给Int,比如使用String.toInt方法,例如: val x: Int = "100".toInt 如果想让字符串自动转换为整形,就

  • scala 读取txt文件的方法示例

    文件格式分别如下 package txt object ReadTxt { def readFromTxtByLine(filePath:String) = { //导入Scala的IO包 import scala.io.Source //以指定的UTF-8字符集读取文件,第一个参数可以是字符串或者是java.io.File val source = Source.fromFile(filePath, "UTF-8") //或取文件中所有行 //val lineIterator = s

  • Scala求和示例代码

    Scala 是一门多范式(multi-paradigm)的编程语言,设计初衷是要集成面向对象编程和函数式编程的各种特性. Scala 运行在Java虚拟机上,并兼容现有的Java程序. Scala 源代码被编译成Java字节码,所以它可以运行于JVM之上,并可以调用现有的Java类库. def sum(f: Int => Int)(a: Int)(b: Int): Int = { @annotation.tailrec def loop(n: Int, acc: Int): Int = { if

  • Scala中正则表达式以及与模式匹配结合(多种方式)

    正则表达式 //"""原生表达 val regex="""([0-9]+)([a-z]+)""".r val numPattern="[0-9]+".r val numberPattern="""\s+[0-9]+\s+""".r 说明:.r()方法简介:Scala中将字符串转换为正则表达式 /** You can follow a st

  • Scala 操作Redis使用连接池工具类RedisUtil

    本文介绍了Scala 操作Redis,分享给大家,具体如下: package com.zjw.util import java.util import org.apache.commons.pool2.impl.GenericObjectPoolConfig import org.apache.logging.log4j.scala.Logging import redis.clients.jedis.{Jedis, JedisPool, Response} import redis.clien

  • 详解Java中的scala正则表达式

    Scala 通过 scala.util.matching 包中的 Regex 类来支持正则表达式. eg:使用正则表达式查找单词 Scala 实例中使用 String 类的 r() 方法构造了一个Regex对象.(也可直接new一个Regex对象实例)然后使用 findFirstIn 方法找到首个匹配项.如果需要查看所有的匹配项可以使用 findAllIn 方法. 可以使用 mkString( ) 方法来连接正则表达式匹配结果的字符串,并可以使用管道(|)来设置不同的模式: 如果需要将匹配的文本

  • 使用Scala生成随机数的方法示例

    一.使用Scala生成随机数 1.简单版本: /* 1.you can use scala.util.Random.nextInt(10) to produce a number between 1 and 10 2.at the same time,you nextInt(100) to produce a number between 1 and 100 */ object Test { def main(args: Array[String]) { var i = 0 while(i <

  • scala+redis实现分布式锁的示例代码

    1.redis的底层是单例模式,意思是同一个脚本同一时刻只能有一个线程来执行,利用redis的这个特性来实现分布式锁. 首先实现工具类 package utils import CacheManager /** * redis分布式锁 */ object RedisTool { //加锁是否成功标志 val LOCK_SUCCESS:String = "OK" //即当key不存在时,我们进行set操作:若key已经存在,则不做任何操作: val SET_IF_NOT_EXIST:St

  • IntelliJ IDEA下Maven创建Scala项目的方法步骤

    环境:IntelliJ IDEA 版本:Spark-2.2.1 Scala-2.11.0 利用 Maven 第一次创建 Scala 项目也遇到了许多坑 创建一个 Scala 的 WordCount 程序 第一步:IntelliJ IDEA下安装 Scala 插件 安装完 Scala 插件完成 第二步:Maven 下 Scala 下的项目创建 正常创建 Maven 项目(不会的看另一篇 Maven 配置) 第三步:Scala 版本的下载及配置 通过Spark官网下载页面http://spark.a

  • 浅析scala中map与flatMap的区别

    在函数式语言中,函数作为一等公民,可以在任何地方定义,在函数内或函数外,可以作为函数的参数和返回值,可以对函数进行组合.由于命令式编程语言也可以通过类似函数指针的方式来实现高阶函数,函数式的最主要的好处主要是不可变性带来的.没有可变的状态,函数就是引用透明(Referential transparency)的和没有副作用(No Side Effect). 任何一种函数式语言中,都有map函数与faltMap这两个函数,比如python虽然不是纯函数式语言,也有这两个函数.再比如在jdk1.8之后

  • scala当中的文件操作和网络请求的实现方法

    1.读取文件当中每一行的数据 def main(args: Array[String]): Unit = { //注意文件的编码格式,如果编码格式不对,那么读取报错 val file: BufferedSource = Source.fromFile("F:\\files\\file.txt","GBK"); val lines: Iterator[String] = file.getLines() for(line <- lines){ println(li

随机推荐