Scala传名参数(By-Name)
1.=>
在了解Scala的By-Name参数之前,先了解下“=>”在Scala中有几种用法:
1.对于值,“=>”相当于lambda表达式。如:
scala> List(,,).map{(x: Int) => x*}
res0: List[Int] = List(, , )
scala> val test: Function1[Int,String] = myInt => "my int: " + myInt.toString
test: Int => String = <function1>
scala> test()
res0: String = my int: scala> val test: Int => String = myInt => "my int: "+ myInt.toString
test: Int => String = <function1> scala> test()
res1: String = my int:
- 如果参数为空,即“=>”左边为空,形式是:() => T。如
scala> val test: Function0[String] = () => "Hello"
test: () => String = <function0> scala> test()
res3: String = Hello scala> val test: () => String = () => "Hello"
test: () => String = <function0> scala> test()
res4: String = Hello
如果无返回值,即“=>”右边为空,形式是:A[, B...] => Unit
- scala> val test: Int => Unit = myInt => println(myInt)
- test: Int => Unit = <function1>
- scala> test(1)
- 1
- 如果无参且无返回值,即“=>”两边都为空,形式是:() => Unit
- scala> val test: Function0[Unit] = () => println("Hello")
- test: () => Unit = <function0>
- scala> test()
- Hello
- scala> val test: () => Unit = () => println("Hello")
- test: () => Unit = <function0>
- scala> test()
- Hello
3.如果作为一个函数的参数的类型声明,且左边没有任何符号,如def func(param: => T)。这种形式叫做By-Name parameter。
4.在case语句中,“=>”用于分隔模式和结果表达式。
2.By-Name Parameter
By-Value参数,我们都比较熟悉,参数在进入函数前就进行计算,最后传入的最终的计算结果。
By-Name参数,表示参数在进入函数后,每次在函数体内调用的时候才会计算。
def myByName1(param: () => Boolean): Unit = {
println("start")
println(param) //println(param.apply())也可以
println("end")
}
//要实现传名函数,要定义的类型开始于“=>”,而不是“() =>”。
//myByName1{7>9}不会有效,因为缺少“() =>”
myByName1{() =>
println("enter")
>
}
其中“=>”后面的代码是整体作为参数,所以会在函数体里被调用的时候才会执行。输出如下:
start enter false end
再看下一种情况,只有“() =>”之后的代码是By-Name参数。“() =>”之前的代码是By-Value参数,即当调用myByName2的时候就会立即执行:
- def myByName2(param: () => Boolean): Unit = {
- println("start")
- println(param) //println(param.apply())也可以
- println("end")
- }
- myByName2{
- println("enter")
- () => 7 > 9
- }
输出如下:
- enter
- start
- false
- end
下面来看标准的By-Name参数:
- def myByName(param: => Boolean): Unit = {
- println("start")
- println(param)
- println("end")
- }
- myByName{
- println("enter")
- 7 > 9}
3.函数作为参数
- def test(num: Int => String, str: String => Int): Unit = {
- val i = 10
- val s = "5"
- println(num(i))
- println(str(s))
- }
- def num(x: Int): String = {
- x.toString()
- }
- def str(s: String): Int = {
- s.toInt
- }
- test(num, str)
Scala传名参数(By-Name)的更多相关文章
- scala -- 传名参数
object Test{ def main(args: Array[String]): Unit = { def test(code : => Unit){// 传名参数 不计算函数值,而是把函 ...
- scala的传名参数
scala如果你想实现像if ,while等类似的控制结构,根本没有值要传入花括号{}直接的代码里.要怎么实现. 比如说,我们要实现一个断言的控制结构,myAssert(), myAssert函数参考 ...
- 快学Scala 第二课 (apply, if表达式,循环,函数的带名参数,可变长参数,异常)
apply方法是Scala中十分常见的方法,你可以把这种用法当做是()操作符的重载形式. 像以上这样伴生对象的apply方法是Scala中构建对象的常用手法,不再需要使用new. if 条件表达式的值 ...
- Scala 函数入门之默认参数和带名参数
Scala 默认参数 在Scala中,有时我们调用某些函数时,不希望给出参数的具体值,而希望使用参数自身默认的值,此时就定义在定义函数时使用默认参数. def sayHello(firstName: ...
- 百度上传工具webuploader,图片上传附加参数
项目中需要上传视频,图片等资源.最先做的是上传图片,开始在网上找了一款野鸡插件,可以实现图片上传预览(无需传到后台).但是最近这个插件出了莫名的问题,不易修复,一怒之下,还是决定找个大点的,靠谱的插件 ...
- ajaxFileUpload上传带参数,返回值改成json格式
/*直接复制在自己的js文件中就能使用*/ jQuery.extend({ createUploadIframe: function (id, uri) { //create frame var fr ...
- springboot 传List参数
最近项目有个需求,前台需要传list参数请求controller接口,一开始直接使用ResponseBody注解,但实践下来发现参数没有传到controller. 现将处理方式记录如下: 1.前台 ...
- javascript之url转义escape()、encodeURI()和decodeURI(),ifram父子传参参数有中文时出现乱码
ifram父子传参参数有中文时出现乱码,可先在父级页面用encodeURI转义,在到子页面用进行decodeURI()解码 我们可以知道:escape()除了 ASCII 字母.数字和特定的符号外,对 ...
- javaWeb传收参数方式总结
有时候,我真会被传参搞得头晕,这样传要怎么接收,那样传又要怎么接收? get可以json吗?什么是json方式提交?等等问题,已困扰我许久 所以,在此想做个总结,整理一下思绪,不再为传收参烦恼!如有错 ...
随机推荐
- SpringMVC整合Thymeleaf
Thymeleaf的介绍 进行JavaWeb开发时主要用到的是JSP,传统的JSP需要在页面中加入大量的JSTL标签,这些标签只能运行在服务器中,前端开发人员维护这些页面比较困难,页面加载速度也比较慢 ...
- 《DSP using MATLAB》Problem 5.8
代码: %% ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ %% Output In ...
- centos7虚拟机安装elasticsearch5.0.x-安装篇
https://blog.csdn.net/u012371450/article/details/51776505 请预先安装jdk 创建新用户(非root用户)elasticsearch只能用非ro ...
- 【HAOI2012】外星人
又犯sb错了QAQ 原题: 艾莉欧在她的被子上发现了一个数字 ,她觉得只要找出最小的x使得,.根据这个 她就能找到曾经绑架她的外星人的线索了.当然,她是不会去算,请你帮助她算出最小的x. test&l ...
- Python面试 【315+道题】
Python面试 [315+道题] 第一部分 Python基础篇(80题) 为什么学习Python? 因为看到python的发展趋势,觉得需要与时俱进,第一点,python开发速度极快,能快速完成一个 ...
- 通信协议演进与JCE协议详解
一.通信协议概述通信协议是两个节点之间为了协同工作.实现信息交换,而协商的规则和约定,例如规定字节序,各个字段类型,使用什么压缩算法或加密算法等. 1.原始数据假设A和B通信,获取或设置用户基本资料, ...
- 使用C语言简单模拟Linux的cat程序
先给出源码 //fileio.c #include<stdio.h> #include<stdlib.h> #include<fcntl.h> void print ...
- 有用的proc文件系统文件
1. /proc/iomem I/O内存映射 2. /proc/meminfo 系统内存信息
- NYOJ 483 Nightmare 【广搜】+【无标记】
版权声明:长风原创 https://blog.csdn.net/u012846486/article/details/31032479 Nightmare 时间限制:1000 ms | 内存限制: ...
- Delphi中Json格式读写
Json是一种轻量级传输数据格式,广泛应用互联网和各应用中.json主要採用键值对来表示数据项.多个数据项之间用逗号分隔,也能够用于数组.以下注重介绍一下在delphi中使用json,在delphi中 ...