Scala 传名参数、注解
传名参数
传名参数仅在使用时求值。在类型之前添加=>,即可令参数为传名参数。
定义传名参数
def ggg(kkk: => Int) = kkk * 999
传名参数的优势在于,如果函数体中没有使用过此参数,此参数不会求值,并且它们也只会被求一次值。
如果参数是计算密集的求值或者长运行时间的代码(例如,获取URL),传名参数提供的延迟参数计算直到参数被使用的机制有助于提升性能。
注解
注解与定义的元数据相关联。例如,方法之前的@deprecated注解用于告知编译器在方法被使用时打印一条警告信息。
使用注解
@deprecated("dasdfjasldkjfa;sdfasdf", "155131353")
def hello = "hola"
注解用于紧跟在其后的首个定义或声明。可以有一个以上的注解位于定义或声明之前,这些注解的顺序并不会产生什么影响。
1 确保编码的注解
在没能满足指定条件时,一些注解可以令编译失败。例如,@tailrec可以确保访问为尾递归。尾递归可以令内存需求保持不变。
# 使用@tailrec
import scala.annotation.tailrecdef factorial(x: Int): Int = {@tailrecdef factorialHelper(x: Int, accumulator: Int): Int = {if (x == 1) accumulator else factorialHelper(x - 1, accumulator * x)}factorialHelper(x, 1)
}
2 影响代码生成的注解
一些注解(例如,@inline)将会影响生成的代码。(即,如果使用了此注解,生成的jar文件将会有些许不同)。内联即将方法体中的代码插入调用点。作为结果的字节码将会更长,但是运行起来可能更快。使用@inline注解并不确保方法将会被内联,但是当且仅当如果某些生成代码的大小的启发被满足时,它将会令编译器执行内联。
Java 注解
当编写与Java交互的Scala的代码时,需要注意两者在注解的语法上存在着些许的不同。使用Java注解时,需要确保使用-target:jvm -1.8选项。
Java以注解的形式提供用户自定义元数据。注解的一个关键特性是它们依赖指定的键值对来初始化元素。
例如,如果需要一个用于追踪类的来源的注解,可以如下定义:
@interface Source {public String URL();public String mail();
}
然后以如下语法使用:
@Source(URL = "http://coders.com/",mail = "support@coders.com")
public class MyClass extends HisClass ...
Scala中的注解应用类似于构造器调用,为了实例化Java注解,需要使用命名参数:
@Source(URL = "http://coders.com/",mail = "support@coders.com")
class MyScalaClass ...
如果注解指包含一个元素(除却默认值),那么使用命名参数就显得非常繁琐,所以,通常,如果将这个元素的名称指定为value,便可以以类构造器语法在Java中应用:
@interface SourceURL {public String value();public String mail() default "";
}
然后以如下方式应用
@SourceURL("http://coders.com/")
public class MyClass extends HisClass ...
在这种情况下,Scala提供了相同机制
@SourceURL("http://coders.com/")
class MyScalaClass ...
由于mail元素已经被提供了默认值,所以不需要显式为其提供值。但是,如果需要mail的值,在Java中不能混合使用这两种方式:
@SourceURL(value = "http://coders.com/",mail = "support@coders.com")
public class MyClass extends HisClass ...
但是Scala在这方面具有更好的灵活性
@SourceURL("http://coders.com/",mail = "support@coders.com")class MyScalaClass ...
翻译源:Scala Tour
Scala 传名参数、注解相关推荐
- Scala 传名参数和传值参数
Scala 传名参数和传值参数 传名参数 call-by-name 传值参数 call-by-value 在Scala中,当参数通过传值调用函数时,它会在调用函数之前计算一次传入的表达式或参数值.但是 ...
- Scala传名参数(By-Name)
1.=> 在了解Scala的By-Name参数之前,先了解下"=>"在Scala中有几种用法: 1.对于值,"=>"相当于lambda表达式. ...
- 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 ...
最新文章
- DSAPI多功能组件编程应用-DS提示气泡
- vs2003不能正常调试或运行!
- Financiers Game CodeForces - 737D (博弈论,区间dp)
- 每天一道CTF---BUUCTF---练习场----EasySQL1---
- 深度学习导论(3)PyTorch基础
- 关于windows上的exe可执行程序在黑色窗口运行时候不能点击屏幕,要不然会暂定程序
- Android培训翻译_允许其他应用程序启动你的Activity
- [汇编语言]实验二:字的传送
- ssh根据姓名查询的时候报错java.lang.IndexOutOfBoundsException: Remember that
- servlet和jsp页面过滤器Filter的作用及配置
- MyBatis-Plus_LambdaQueryWrapper
- WindowsXP 系统登陆原理及其验证机制概述
- 使用PackageManager获得应用(包)信息
- 深度学习6-自定义层详解
- 互联网网站采集工具大比拼和选择指南
- oracle中的userenv,Oracle 中的userenv()
- 系统可打开最大文件数过小,导致CHECK_NRPE: Error - Could not complete SSL handshake
- SiT5357:±0.1~±0.25ppm超高精度Stratum 3温补振荡器TCXO,60-220MHz
- ORA-01918: user hr does not exist 解决办法
- ArrayList.add方法底层浅析
热门文章
- springboot版本控制
- 免费申请5T的微软OneDrive云盘
- windows系统socket泄露问题解决--No buffer space available (maximum connections reached?): JVM_Bind
- 栅格法建立环境地图及MATLAB实现
- 无门槛vbs定时刷新页面
- 练习3-5 输出闰年
- C# partial
- STM32个人笔记-看门狗
- 程序员是怎样练打字速度
- Ask, Attend and Answer: Exploring Question-Guided Spatial Attention for Visual Question Answering