Scala传名参数(By-Name)
1.=>
在了解Scala的By-Name参数之前,先了解下“=>”在Scala中有几种用法:
1.对于值,“=>”相当于lambda表达式。如:
scala> List(1,2,3).map{(x: Int) => x*2} res0: List[Int] = List(2, 4, 6)
scala> val test: Function1[Int,String] = myInt => "my int: " + myInt.toString test: Int => String = <function1> scala> test(1) res0: String = my int: 1scala> val test: Int => String = myInt => "my int: "+ myInt.toString test: Int => String = <function1>scala> test(1) res1: String = my int: 1
- 如果参数为空,即“=>”左边为空,形式是:() => T。如
scala> val test: Function0[String] = () => "Hello" test: () => String = <function0>scala> test() res3: String = Helloscala> 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")7 > 9}
其中“=>”后面的代码是整体作为参数,所以会在函数体里被调用的时候才会执行。输出如下:
startenterfalseend
再看下一种情况,只有“() =>”之后的代码是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 传名参数和传值参数
Scala 传名参数和传值参数 传名参数 call-by-name 传值参数 call-by-value 在Scala中,当参数通过传值调用函数时,它会在调用函数之前计算一次传入的表达式或参数值.但是 ...
- Scala 传名参数、注解
传名参数 传名参数仅在使用时求值.在类型之前添加=>,即可令参数为传名参数. 定义传名参数 def ggg(kkk: => Int) = kkk * 999 传名参数的优势在于,如果函数体 ...
- Scala学习笔记——传名参数和传值参数
Scala传名参数和传值参数 文章目录 `Scala`传名参数和传值参数 `1.` 定义 `2.` 两者的比较 `3.` 自定义`while`循环 1. 定义 Scala的解释器在解析函数参数(fun ...
- scala的传名参数
scala如果你想实现像if ,while等类似的控制结构,根本没有值要传入花括号{}直接的代码里.要怎么实现. 比如说,我们要实现一个断言的控制结构,myAssert(), myAssert函数参考 ...
- scala的传名参数和传值参数
传名参数 传值参数 因为Scala建议如果函数的参数只有一个,可以考虑使用{}代替(),因此test和test1的调用都是{},又因为test的参数是传名参数函数,因此传入的参数是不会被执行的,而te ...
- scala控制抽象之传名参数(名调用)
我们在用scala定义函数时,一般参数都是各种类型的值,这是常见的值调用 但偶尔也有需要把代码块作为参数传入的情况(名调用) 匿名函数经常可以作为函数的参数传入,非匿名函数也行(函数作为返回值返回就更 ...
- 【值传递和引用传递之外的第三种传值方式 - 传名参数】
引言 先看下Scala 的以下方法该如何调用那? class Demo {val assertIsOpen = truedef test(isTrue: () => Boolean): Unit ...
- scala 柯里化+传名参数+递归 实现while关键字功能
目录 代码实现 解读 代码实现 object Lambda {def main(args: Array[String]): Unit = {def myWhile(condition: => B ...
- scala的传值参数和传名参数
object ScalaDemo extends App{var n = 10def count:Int = {n -= 1n}def invokeByName(x : => Int):Unit ...
最新文章
- displaytag 导出
- 达达O2O后台架构演进实践:从0到4000高并发请求背后的努力!
- R语言数据结构之矩阵
- JAVA中栈和堆总结
- linux基础学习(九)
- 服务稳定性及应用防护方案
- oracle 10g 关库,Oracle Db10g 启动和关闭数据库
- supervisord的安装使用
- 循环次数几次_圆柱模板循环使用次数是多少呢
- asyncio oracle 异步,带有asyncio futures和RuntimeError的InvalidStateError与aiohttp时使用期货回调...
- oracle 数据结构部署,
- MySQL 8.0中的JSON增强
- 得罪全球首富的下场?曝光贝佐斯婚外情丑闻的小报将被卖身...
- 检索召回 技术综述!
- 谁爱谁都没有错... ...
- 制造业案例 | 美创助力纳爱斯集团三层业务安全审计实践
- ps证件照白底换蓝底_【插件】PS插件证件照V2.0一键裁剪排版磨皮换装换底色软件2020Mac/Win完整版...
- 多目标优化系列(四)RM-MEDA
- 四、AOSP-开机报错
- [科研]本科生毕业论文查重网站汇总
热门文章
- 在sdk中添加源文件_实用干货 | 一步一步教你在SpringBoot中集成微信刷卡支付
- 脑科学与脑电基础知识汇总
- JStorm与Storm源码分析(八)--计时器工具-mk-timer
- [CES 2018] TPCast发布升级版本,将支持微软MR设备
- 不出声也能命令Siri!康奈尔大学华人团队开发无声语言识别项链,中文英文都行...
- 万万没想到,钉钉居然是个AI平台
- Google人体图像分割模型Bodypix再次更新,针对Coral开发板优化,720p/30fps流畅运行...
- 程序员硬核劝告:现在还不是出门的时候
- 170多个Ionic Framework学习资源(转载)
- 【ShareCode】不错的技术文章 -- 如何使用异或(XOR)运算找到数组中缺失的数?...