Scala:如何编写新的控制结构

拥有第一类函数的语言中,即使语言的语法是固定的,你也可以有效地制作新的控制结构。所有你需 要做的就是创建带函数做参数的方法。例如,下面是“双倍”控制结构,能够重复一个操作 两次并返回结果:

scala> def twice(op: Double => Double, x: Double) =

 op(op(x))twice: ((Double) => Double,Double)Doublescala> twice(_ +

 1, 5)res9: Double = 7.0

这个例子里op的类型是Double => Double,就是说 它是带一个Double做参数并返回另一个Double的函数。

任何时候你发现你的代码中多个地方有重 复的控制模式,你就应该考虑把它实现为一个新的控制结构。本章早些时候你看到了filesMatching,一 个极度特化了的控制模式。现在考虑一个更宽泛使用的代码模式:打开一个资源,对它进行操作,然后 关闭资源。你可以使用如下的方法将其捕获并放入控制抽象:

def withPrintWriter(file: 

File, op: PrintWriter => Unit) { val writer = new PrintWriter(file) try {  op(writer) } finally {  writer.close() }}

有了这个方法,你就可以这样使用:

withPrintWriter(   new File

("date.txt"),   writer => writer.println(new java.util.Date))  

使用这个方法的好处是,由withPrintWriter而不是用户的代码,确认文件在结尾被关 闭。因此忘记关闭文件是不可能的。这个技巧被称为贷出模式:loan pattern,因为控制抽象函数,如 withPrintWriter,打开了资源并“贷出”给函数。例如,前面例子里的withPrintWriter把 PrintWriter借给函数op。当函数完成的时候,它发出信号说明它不再需要“借”的资源。于 是资源被关闭在finally块中,以确信其确实被关闭,而忽略函数是正常结束返回还是抛出了异常。

让客户代码看上去更像内建控制结构的一种方式是使用大括号代替小括号包围参数列表。Scala 的任何方法调用,如果你确实只传入一个参数,就能可选地使用大括号替代小括号包围参数。例如,代 之以:

scala> println("Hello, world!")Hello, world!

你可以写成:

scala> println { "Hello, world!" }Hello, 

world!

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索函数
, 参数
, double
, 控制
, 括号
一个
,以便于您获取更多的相关知识。

时间: 2024-12-04 18:18:58

Scala:如何编写新的控制结构的相关文章

编译-NCTUns添加模块问题或自己编写新模块步骤

问题描述 NCTUns添加模块问题或自己编写新模块步骤 最近在用NCTUns做路由协议仿真,请问有没有大侠在NCTUns上添加新的路由协议模块成功的,比如GPSR或是自己写的协议模块编译通过的?摆脱各位了 解决方案 http://www.pudn.com/downloads628/sourcecode/unix_linux/network/detail2553472.html 解决方案二: 你回答的很迅速,谢谢,这个文档我之前下载过

如何为xen4版本编写新的前端设备驱动?都需要在那部分进行改进?

问题描述 如何为xen4版本编写新的前端设备驱动?都需要在那部分进行改进? 如何为xen4版本编写新的前端设备驱动?都需要在那部分进行改进? 可能比较麻烦,可以支付相应报酬.急求!求大神指导. 解决方案 这个是比较麻烦,建议你找一下专业人员,仔细详谈一下费用,然后让他们给你实现,最好是本地的 解决方案二: 怎么联系呢?专业人员是指?

黑客编写新驱动Kinect体感操作玩《街霸4》

据海外媒体报道,有国外黑客日前编写了新的Kinect驱动程序,玩家可以体感操作经典的格斗游戏<街头霸王4>. 作者demize2010通过此前公布的Kinect开源程序编写了一个FAAST脚本,Kinect可以扫描玩家的肢体动作并通过脚本命令反馈在角色动作上.比如当你挥手时,游戏中的角色就会出拳:当你踢腿时,游戏中的角色也会出腿:而像经典的"波动拳"和"升龙拳"则可以通过模拟招式的动作完成,非常具有代入感. 不过demize2010编写的驱动程序只可识别

Zope3编写新的内容对象

在Zope 3中实现新的内容对象对Zope3http://www.aliyun.com/zixun/aggregation/7155.html">开发人员来讲其重要性不言而喻.为了让讲解更加具有可操作性,本章将使用一个留言簿范例来帮助大家理解.下面一章,我们将列出在Zope3中实现和注册一个新内容组件所需的主要步骤. 本章将是我们开发一个 MessageBoard 类型的一个起点. 在任务开始前,我们认为您已经安装好了 Zope 3 , 还有您也已经具备了 Python 的编程技能,当然更

《Spark大数据分析:核心概念、技术及实践》Scala编程

本节书摘来自华章出版社<Spark大数据分析:核心概念.技术及实践>一书中的第1章,第2节,作者穆罕默德·古勒(Mohammed Guller)更多章节内容可以访问"华章计算机"公众号查看. Scala编程 Scala是当前热门的现代编程语言之一.它是编程语言界的凯迪拉克.它是一门强大且优美的语言.学会了它,对你的职业生涯大有裨益. 用不同的编程语言都可以编写大数据应用程序,比如Java.Python.C++.Scala等.Hadoop本身就是用Java编写的.尽管大多数的

《Spark大数据分析:核心概念、技术及实践》一 第2章 Scala编程

  本节书摘来自华章出版社<Spark大数据分析:核心概念.技术及实践>一书中的第2章,第2.1节,作者[美] 穆罕默德·古勒(Mohammed Guller),更多章节内容可以访问"华章计算机"公众号查看. 第2章 Scala编程 Scala是当前热门的现代编程语言之一.它是编程语言界的凯迪拉克.它是一门强大且优美的语言.学会了它,对你的职业生涯大有裨益. 用不同的编程语言都可以编写大数据应用程序,比如Java.Python.C++.Scala等.Hadoop本身就是用J

Visual Basic.NET 中的语言新变化

visual 简介 要快速创建企业级的Web应用程序,开发人员必须依赖于可伸缩性.强壮性和可重用性等商业逻辑.在过去的几年中,面向对象的程序设计成为符合这些要求的系统的首要方法.使用面向对象的编程语言有助于使大规模的系统更易于理解.更易于调试.升级更迅速. 为了使Visual Basic开发人员能够从面向对象设计中受益并简化企业级Web应用程序的开发,Visual Basic的下一个版本­--Visual Basic.NET将支持包括实现继承在内的全部面向对象的语言特性.有了这些语言特性,Vis

《深入理解Scala》——第1章,第1.2节当函数式编程遇见面向对象

1.2 当函数式编程遇见面向对象 深入理解Scala 函数式编程和面向对象编程是软件开发的两种不同途径.函数式编程并非什么新概念,在现代开发者的开发工具箱里也绝非是什么天外来客.我们将通过Java生态圈里的例子来展示这一点,主要来看Spring Application framework和Google Collections库.这两个库都在Java的面向对象基础上融合了函数式的概念,而如果我们把它们翻译成Scala,则会优雅得多.在深入之前,我们需要先理解面向对象编程和函数式编程这两个术语的含义

编写、加载和存取插件程序(Plug-Ins)

在 2005 年一月刊的 MSDN 杂志文章中,你有一个例子程序的代码是用混合模式编写的.有没有可能动态加载 .NET 类或 DLL 并调用那些函数呢?假设我有一个本机 C++ 应用程序,我想允许用户在 .NET 中为该 C++ 程序编写插件.就像在 .NET 中使用 LoadLibrary 加载 DLLs 一样. Ravi Singh 我正在用 Visual C++ 6.0 编写一个插件应用,它是一个 DLL,输出和接收纯虚拟接口指针.加载 DLL 后,EXE 便调用 DLL 中输出的 C 函