返回介绍

数学基础

统计学习

深度学习

工具

Scala

五、自定义控制结构

发布于 2023-07-17 23:38:23 字数 2648 浏览 0 评论 0 收藏 0

  1. 在拥有一等函数的语言中,可以有效地制作出新的控制接口,方法是:创建接收函数作为入参的方法。

  2. 通常,当你发现某种模式在代码中多处出现,就应该考虑将这种模式实现为新的控制结构。

    如一个常见的编码模式:打开资源,对资源进行操作,然后关闭资源。这可以自定义一个控制抽象:

    
    
    xxxxxxxxxx
    def withPrinter(file:File,op:Printer => Unit) = { val printer = new Printer(file) try { op(printer) } finally { printer.close() } }

    然后可以方便的使用该方法来管理 Printer

    
    
    xxxxxxxxxx
    withPrinter( new File("data.txt"), // file 实参:一个 File 对象 printer => printer.printFile() // op 实参:一个函数 )

    这可以确保资源printer 在最后关闭。这种技巧被称作贷出模式 loan pattern

    在例子中,withPrinter 负责创建资源,然后将资源贷给op;当op 完成时,表示不再需要资源,此时由withPrinter 负责关闭资源。

  3. 可以使用花括号而不是圆括号来表示参数列表,这样调用方的代码看上去更像是在使用内建的控制结构。

    注意:Scala 中,这个花括号技巧仅对传入单个参数的场景适用。

    
    
    xxxxxxxxxx
    println("Hello,scala!") // 圆括号调用 println {"Hello,scala!"} // 花括号调用 val s = "Hello,scala!".substring {7,9} // 编译失败,必须用 substring(7,9)
    • 这个技巧是为了让调用方更便利的编写函数字面量,从而使得函数用起来更像是控制结构。

    • 如果有多个参数,则可以通过柯里化来适配该技巧。

      
      
      xxxxxxxxxx
      def withPrinter(file:File)(op:Printer => Unit) = { val printer = new Printer(file) try { op(printer) } finally { printer.close() } } val file = new File("data.txt") withPrinter(file) { // 现在 withPrinter 更像是控制结构了 printer => printer.printFile() }

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文