文档章节

Scala函数调用省略点号和括号

秋风醉了
 秋风醉了
发布于 2015/04/29 19:19
字数 476
阅读 343
收藏 0

Scala函数调用省略点号和括号


省略括号

如果一个方法不用接受参数,你可以无需括号就定义它。调用者也必须不加括号地调用它。如果你加上了空括号,那么调用者可以有选择地加或者不加括号。例如,List 的size 方法没有括号,所以你必须写List(1,2,3).size。如果你尝试写List(1,2,3).size() 就会得到一个错误。如下代码,

println(List(1, 2, 3).size)
println(List(1, 2, 3).size())

运行并输出,

C:\WorkSpace6-scala\scala-train\src\com\usoft\traversing_mapping_so_on.scala:154: error: Int does not take parameters

println(List(1, 2, 3).size())

                          ^

one error found

然而,String 类的length方法在定义时带有括号,所以,"hello".length() 和"hello".length 都可以通过编译。

Scala 社区的约定是,在没有副作用的前提下,省略调用方法时候的空括号。所以,查询一个序列的大小(size)的时候可以不用括号,但是定义一个方法来转换序列的元素则应该写上括号。


省略点号

如下示例,size 方法是List中得到 List 大小的函数,调用时 可以省略点号

scala> List(1,2,3) size
warning: there was one feature warning; re-run with -feature for details
res4: Int = 3

在scala的脚本文件中这样写,

println("hello world" substring(0, 3))

运行并输出,

C:\WorkSpace6-scala\scala-train\src\com\usoft>scala traversing_mapping_so_on.scala

hel

甚至这样写都可以,

println("hello world" substring(0, 3) toUpperCase() indexOf "h")


函数调用使用 {} 代替 ()

当函数 只接收一个参数时,就可以使用花括号 代替 圆括号。如下,

// 定义一个柯里化的函数
def sum(i: Int)(j: (Int) => Int) = j(i)
val res99 = sum(1) { i => i + 10 }
println(res99) // 11


def p(x: Int): Unit = {
  println(x)
}

p {
  2
}

运行并输出,

C:\WorkSpace6-scala\scala-train\src\com\usoft>scala traversing_mapping_so_on.scala

11

2

===========END===========

© 著作权归作者所有

共有 人打赏支持
秋风醉了
粉丝 236
博文 578
码字总数 419420
作品 0
朝阳
程序员
【Spark亚太研究院系列丛书】Spark实战高手之路-第2章动手实战Scala第1小节(2)

2,Scala函数特性编程实战 当函数不带参数的使用,我们调用的时候可以省略括号: 接下来定义一个匿名函数、调用并运行: 在Scala总函数式一等公民 ,所以我们可以把函数付给一个常: 另外一个...

Spark亚太研究院
2014/11/24
0
0
关于scala搞出的新概念的语法糖

对于scala搞那么多语法糖和新概念真是又爱又恨。爱的是scala引入了java一直没有的lambda特性,这对于使用高阶函数抽象来处理集合数据非常有爱(spark简洁的RDD处理得益于此)。恨的是scala搞...

中成才
2015/11/15
0
0
scala入门-02基础知识->方法

首先在src下的main下的scala下创建一个包为org.scala.base 创建一个scala类名称为HelloWorld.scla 由于main方法要位于object对象中,所以我们创建一个object 名称为HelloWorld 并增加main方法...

stark_summer
2015/01/09
0
0
Methods with empty argument lists

Methods with empty argument lists scala在没有参数的方法调用上是非常灵活的。 如果一个方法没有参数,你可以不用括号来定义这个方法,调用的时候一定不加括号。 相反的,如果你在定义无参...

秋风醉了
2015/12/20
17
0
Scala 中不带括号的函数与带括号函数的差别

在Scala中, 定义一个不带任何参数函数可以这样写: def name = "Archer" 调用不带括号的函数时不能带括号. 比如调用刚才定义的函数name,只能写name, 不能写name(), 除非函数name定义时加上括...

mj4738
2012/02/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

自己手写一个 SpringMVC 框架

前端框架很多,但没有一个框架称霸,后端框架现在Spring已经完成大一统.所以学习Spring是Java程序员的必修课. Spring 框架对于 Java 后端程序员来说再熟悉不过了,以前只知道它用的反射实现的,...

别打我会飞
12分钟前
0
0
01-《Apache Tomcat 9》之文件索引

《Apache Tomcat 9》是《看Apache官方文档学英语》的第一个专栏!让我们一起在看文档的过程中学英语,在学英语的过程中夯实技术! Documentation Index - 文件索引 Introduction - 介绍 This...

飞鱼说编程
14分钟前
0
0
最近

20181016最近在熟悉业务 关于money的 要涉及到流程中转同步 这个点感觉 业务大于技术 关于业务性的内容 还是要把自己及时清零的好 我们需要好好的梳理下业务内容 业务作为导向 技术提供解决方...

JAVA码猿
23分钟前
0
0
JDK1.8HashMap源码分析

HashMap和Hashtable的主要区别是: 1. Hashtable是线程安全,而HashMap则非线程安全,Hashtable的实现方法里面大部分都添加了synchronized关键字来确保线程同步,因此相对而言HashMap性能会高...

小小明童鞋
33分钟前
15
0
以Redis为例,详谈分布式系统缓存的细枝末节

前言: 在分布式Web程序设计中,解决高并发以及内部解耦的关键技术离不开缓存和队列,而缓存角色类似计算机硬件中CPU的各级缓存。如今的业务规模稍大的互联网项目,即使在最初beta版的开发上...

Java干货分享
36分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部