快速业务通道

面向Java开发人员的Scala指南 - 包和访问修饰符 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-20
充当函数的对象)可以定义一个 apply 方法来提供类似于函数或方法的语义:

清单 10. 使用 Functor!

class ApplyTest {   import org.junit._, Assert._   @Test def simpleApply =   {    class Functor    {     def apply() : String =     {      "Doing something without arguments"     }     def apply(i : Int) : String =     {      if (i == 0)       "Done"      else       "Applying... " + apply(i - 1)     }    }    val f = new Functor    assertEquals("Doing something without arguments", f() )    assertEquals("Applying... Applying... Applying... Done", f(3))   } }

面向Java开发人员的Scala指南 - 包和访问修饰符(6)

时间:2011-01-30 Ted Neward

好奇的读者会想是什么使仿函数不同于匿名函数或闭包呢?事实证明,它们之间的关系相当明显:标准 Scala 库中的 Function1 类型(指包含一个参数的函数)在其定义上有一个 apply 方法。快速浏览一些为 Scala 匿名函数生成的 Scala 匿名类,您就会明白生成的类是 Function1(或者 Function2 或 Function3,这要看该函数使用了几个参数)的后代。

这意味着当匿名的或者命名的函数不一定适合期望设计方法时,Scala 开发人员可以创建一个 functor 类,提供给它一些初始化数据,保存在字段中,然后通过 () 执行它,无需任何通用基类(传统的策略模式实现需要这个类):

清单 11. 使用 Functor!

class ApplyTest {   import org.junit._, Assert._   // ...   @Test def functorStrategy =   {    class GoodAdder    {     def apply(lhs : Int, rhs : Int) : Int = lhs + rhs    }    class BadAdder(inflateResults : Int)    {     def apply(lhs : Int, rhs : Int) : Int = lhs + rhs * inflateResults    }    val calculator = new GoodAdder    assertEquals(4, calculator(2, 2))    val enronAccountant = new BadAdder(50)    assertEquals(102, enronAccountant(2, 2))   } }

任何提供了被适当赋予了参数的 apply 方法的类,只要这些参数都按数字和类型排列了起来,它们都会在被调用时运行。

结束语

Scala 的打包、导入和访问修饰符机制提供了传统 Java 编程人员从未享受过的更高级的控制和封装。例如,它们提供了导入一个对象的选择方法的能力,使它们看起来就像全局方法一样,而且还克服了全局方法的传统的缺点;它们使得使用那些方法变得极其简单,尤其是当这些方法提供了诸如本系列早期文章(“Scala 控制结构内部揭密”)引入的虚构的 tryWithLogging 函数这样的高级功能时。

同样,“应用” 机制允许 Scala 隐藏函数部分的执行细节,这样,编程人员可能会不知道(或不在乎)他们正调用的东西 事实上不是一个函数,而是一个非常复杂的对象。该机制为 Scala 机制的函数特性提供了另一个方面,当然 Java 语言(或者 C# 或 C++)也提供了这个方面,但是它们提供的语法纯度没有 Scala 的高。

这就是本期的全部内容;在下一期发布前,请尽情欣赏!

本文配套源码

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号