当前位置: 首页 > news >正文

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方法。

##########

转载于:https://www.cnblogs.com/amunote/p/5721912.html

相关文章:

  • UVA202 UVALive5141 Repeating Decimals
  • Oracle练习(2)
  • 巡检查看数据库Process 连接数
  • android-UI组件(四):AdapterView及其子类
  • 让Unity NavMesh为我所用
  • Log打印的:D/dalvikvm(4342): GC_FOR_ALLOC freed
  • servlet的执行原理与生命周期
  • 数组增删改查及冒泡
  • TCP连接状态详解及TIME_WAIT过多的解决方法
  • zabbix架构
  • nginx: bind() to 0.0.0.0:8001 failed (13: Permission denied)
  • Linux统计文件行数
  • ACM竞赛:立方和问题
  • 初级运维(一)
  • 九曲黄河万里沙,浪淘风簸自天涯 — 正则表达式
  • 【Leetcode】101. 对称二叉树
  • 【mysql】环境安装、服务启动、密码设置
  • ES学习笔记(10)--ES6中的函数和数组补漏
  • HTTP 简介
  • LeetCode541. Reverse String II -- 按步长反转字符串
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • PHP的类修饰符与访问修饰符
  • SegmentFault 技术周刊 Vol.27 - Git 学习宝典:程序员走江湖必备
  • 判断客户端类型,Android,iOS,PC
  • 前嗅ForeSpider中数据浏览界面介绍
  • 小程序滚动组件,左边导航栏与右边内容联动效果实现
  • 学习笔记TF060:图像语音结合,看图说话
  • 京东物流联手山西图灵打造智能供应链,让阅读更有趣 ...
  • ​ 全球云科技基础设施:亚马逊云科技的海外服务器网络如何演进
  • ###51单片机学习(2)-----如何通过C语言运用延时函数设计LED流水灯
  • #我与Java虚拟机的故事#连载18:JAVA成长之路
  • #中的引用型是什么意识_Java中四种引用有什么区别以及应用场景
  • $ git push -u origin master 推送到远程库出错
  • (27)4.8 习题课
  • (30)数组元素和与数字和的绝对差
  • (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作...
  • (非本人原创)我们工作到底是为了什么?​——HP大中华区总裁孙振耀退休感言(r4笔记第60天)...
  • (附源码)ssm教师工作量核算统计系统 毕业设计 162307
  • (含react-draggable库以及相关BUG如何解决)固定在左上方某盒子内(如按钮)添加可拖动功能,使用react hook语法实现
  • (免费领源码)python#django#mysql公交线路查询系统85021- 计算机毕业设计项目选题推荐
  • (三)centos7案例实战—vmware虚拟机硬盘挂载与卸载
  • (一)使用Mybatis实现在student数据库中插入一个学生信息
  • (原創) 物件導向與老子思想 (OO)
  • (转) 深度模型优化性能 调参
  • (转)Sql Server 保留几位小数的两种做法
  • (转)VC++中ondraw在什么时候调用的
  • .MSSQLSERVER 导入导出 命令集--堪称经典,值得借鉴!
  • .NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划
  • .NET企业级应用架构设计系列之开场白
  • .NET下的多线程编程—1-线程机制概述
  • @AutoConfigurationPackage的使用
  • @FeignClient注解,fallback和fallbackFactory
  • [ IO.File ] FileSystemWatcher
  • [20171101]rman to destination.txt
  • [2018/11/18] Java数据结构(2) 简单排序 冒泡排序 选择排序 插入排序