scala学习手记29 - 偏应用函数
调用函数可以说成是将函数应用于实参。如果传入所有的预期的参数,就完全应用了这个函数。如果只传入几个参数,就会得到一个偏应用函数。
偏应用函数是一个特殊的概念,在scala中它是使用val定义的,但是在使用时它却更像是一个函数。偏应用函数的定义更接近于python中有默认值的函数(scala实在是和python有太多相似的地方了)。
先来看一个例子:
import java.util.Date
def log(date: Date, message: String) {
//...
println(date + "----" + message)
}
val date = new Date
log(date, "message1")
log(date, "message2")
log(date, "message3")
示例中定义了一个log函数,在log函数中需要传入两个参数date和message。在之后又多次调用log函数,调用时使用了相同的date和不同的message。很显然,这里多次使用相同的date会让人有些小小的不耐烦。所以scala就提供了一个方案让人打消掉这小小的不耐烦:将log函数偏应用到date上,可以避免每次使用都要调用它。
看一下是如何实现的:
val logWithDateBound = log(new Date, _: String)
logWithDateBound("message1")
logWithDateBound("message2")
logWithDateBound("message3")
在示例代码中先将一个值绑定到date参数上,然后用“_”使第二个参数未绑定,这样就构成了一个偏应用函数。然后这个偏应用函数被存到logWithDateBound这个引用里。随后就可以使用不同的message来调用这个新的函数了。
说到底这里还是定义了一个新的函数,不过在定义和使用上都比较自由罢了。说实话,目前我是觉得这个特性是有些华而不实的。这个特性的引入更像是在炒作一个旧有的概念,新瓶装旧酒总让人提不起兴致来。
看下教材上的解释:当创建偏应用函数时,Scala内部会创建一个新类,它有一个特殊的apply()方法。调用偏应用函数,实际上是调用这个apply方法。
##########
scala学习手记29 - 偏应用函数的更多相关文章
- scala学习手记25 - Curry化
curry翻译为中文就是咖喱.意为使用curry可以让代码更有味道. scala里的curry化可以把函数从接收多个参数转换成接收多个参数列表.也就是说我们要编写的函数不是只有一个参数列表,这个参数列 ...
- scala学习手记23 - 函数值
scala的一个最主要的特性就是支持函数编程.函数是函数编程中的一等公民:函数可以作为参数传递给其他函数,可以作为其他函数的返回值,甚至可以在其它函数中嵌套.这些高阶函数称为函数值. 举一个简单的例子 ...
- scala 学习笔记二 方法与函数
1.介绍 Scala 有方法与函数,二者在语义上的区别很小.Scala 方法是类的一部分,而函数是一个对象可以赋值给一个变量.换句话来说在类中定义的函数即是方法. Scala 中的方法跟 Java 的 ...
- scala学习手记40 - 使用case类
前面两节我们已经多次接触过case关键字了.case关键字不仅可以用在match/case中来执行模式匹配,也可以用来修饰类.不过用case修饰的类也主要是用来做模式匹配.在上一节曾经提到过match ...
- scala学习手记40 - case表达式里的模式变量和常量
再来看一下之前的一段代码: def process(input: Any) { input match { case (a: Int, b: Int) => println("Proc ...
- scala学习手记38 - 方法命名约定和for表达式
方法命名约定 之前在学习<运算符重载>一节时曾经说过一个方法命名约定:方法的第一个字符决定了方法的优先级.现在再说另一个命名约定:如果方法以冒号(:)结尾,则调用目标是运算符后面的实例. ...
- scala学习手记30 - 闭包
首先要弄白闭包的概念. 教材中的说法是:闭包是一种特殊的函数值,闭包中封闭或绑定了在另一个作用域或上下文中定义的变量.这里说闭包是一种特殊的函数值. 维基百科中的说法是:在计算机科学中,闭包(英语:C ...
- scala学习手记28 - Execute Around模式
我们访问资源需要关注对资源的锁定.对资源的申请和释放,还有考虑可能遇到的各种异常.这些事项本身与代码的逻辑操作无关,但我们不能遗漏.也就是说进入方法时获取资源,退出方法时释放资源.这种处理就进入了Ex ...
- scala学习手记27 - 下划线与参数
在Scala里,下划线(_)可以表示函数值的参数.如果某个参数在函数里仅使用一次,就可以用下划线表示.每次在函数里用下划线,都表示随后的参数. val arr = Array(1, 2, 3, 4, ...
随机推荐
- C#操作AD及Exchange Server总结(二)
上一节C#操作AD及Exchange Server总结(一)写了对AD的操作,新建AD用户后,通常都需要为此用户开启Exchange邮箱,接下来写如何远程操作Exchange. 三.对Exchange ...
- Dart基础学习03--方法的使用
1.本文主要讲一下Dart中的方法是怎么定义的,下面先看一个简单的例子: void printNumber(num number) { print('The number is $number.'); ...
- HDU 1875 畅通工程再续(kruskal)
畅通工程再续 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...
- python中pip工具的安装与使用
1.在网址https://pip.pypa.io/en/latest/installing 下载get-pip.py文件,放在python更目录,如python3.6目录下 2.在dos命令行中进入g ...
- test-event-create
# 1 创建存储过程 /* delimiter // create procedure test() begin update test SET name = date_format(now(),'% ...
- 《深入理解Linux网络技术内幕》阅读笔记 --- 邻居子系统
1.封包从L3至L2的传送过程如下所示: 本地主机的路由子系统选择L3目的地址(下一个跃点). 根据路由表,如果下一个跃点在同一个网络中,邻居层就把目的L3地址解析为跃点的L2地址.这个关联会被放入缓 ...
- oracle入门(3)——oracle服务解释
[本文介绍] oracle不像mysql,安装后之后一个服务,如果mysql连接不上,打开其服务就行.oracle是有多个服务,哪些服务要开,哪些服务没必要开,对新手来说未必不是一个难点.下面对ora ...
- 前端 CSS 边框
border 边框 solid 实体的 red 边框什么颜色 <!DOCTYPE html> <html lang="en"> <head> & ...
- matplotlib作图——plot() 线图
线图 #定义 matplotlib.pyplot.plot() plot([x], y, [fmt], data=None, **kwargs) plot([x], y, [fmt], [x2], y ...
- Python Tornado框架(TCP层)
Tornado在TCP层里的工作机制 上一节是关于应用层的协议 HTTP,它依赖于传输层协议 TCP,例如服务器是如何绑定端口的?HTTP 服务器的 handle_stream 是在什么时候被调用的呢 ...