文档章节

《programming in scala》2ed chap9学习笔记

谦谦君子
 谦谦君子
发布于 2013/12/30 11:18
字数 613
阅读 19
收藏 0
import java.io.{PrintWriter, File}

/**
 * Created by ly on 13-12-27.
 */
object ControlAbstraction {

  object FileMatcher {
    // 9.1 Reducing code duplication
    private def filesHere = (new File(".")).listFiles

    def fileMatching(query: String, matcher: (String, String) => Boolean) = {
      for (file <- filesHere if matcher(file.getName, query))
      yield file
    }

    def fileEnding_Full(query: String) = fileMatching(query, (fileName: String, query: String) => fileName.endsWith(query))

    // 因为有类型推导,且每个参数按顺序只用了一遍,所以可以用_placeholder
    // 不是closure,因为matcher的两个参数都是bound variable,没有free
    def fileEnding(query: String) = fileMatching(query, _.endsWith(_))

    def fileContaining(query: String) = fileMatching(query, _.contains(_))

    def fileRegex(query: String) = fileMatching(query, _.matches(_))


    // 使用closure避免query参数的传递
    private def fileMatchingClosure(matcher: String => Boolean) = {
      for (file <- filesHere if matcher(file.getName)) yield file
    }

    def fileEndingClosure(query: String) = fileMatchingClosure(_.endsWith(query))

    /*
    9.2 Simplifying client code
    collections types special-purpose looping: List, Set, Map, exists, filter, map
     */

    /*
    9.3 Currying
    A curried function is applied to multiple argument lists, instead of just one.
     */
    def curriedSum(x: Int)(y: Int) = x + y

    def first(x: Int) = (y: Int) => x + y

    val second = first(1)
    val onePlus = curriedSum(1) _
    val result = onePlus(2) // 3

    /*
    9.4 Writing new control structures
    In languages with first-class functions, you can effectively make new control structures even though the syntax of the language is fixed. All you need to
do is create methods that take functions as arguments.
     */
    // loan pattern,可以确保流关闭!
    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)
    )
    /*
    One way in which you can make the client code look a bit more like a
built-in control structure is to use curly braces instead of parentheses to sur-
round the argument list. In any method invocation in Scala in which you’re
passing in exactly one argument, you can opt to use curly braces to surround
the argument instead of parentheses.
     */
    println("Hello, kitty!")
    println {
      "Hello, kitty"
    }

    // 但是两个参数不行,因此需要用curried函数
    //"Hello".substring{7, 9}
    def withPrintWriterCurried(file: File)(op: PrintWriter => Unit) {
      val writer = new PrintWriter(file)
      try {
        op(writer)
      } finally {
        writer.close()
      }
    }

    // 用{}更像是native control structure
    withPrintWriterCurried(new File("data.txt")) {
      writer => writer.println(new java.util.Date())
    }

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

    withPrintWriterCurried2 {
      writer => writer.println(new java.util.Date())
    }(new File("."))

    /*
    9.5 By-name parameters
    withPrintWriter第二个参数,还需要传递writer =>...如果不需要参数的话,可以写得更简洁
     */
    var assertionsEnabled = false

    def myAssert(predicate: () => Boolean) =
      if (assertionsEnabled && !predicate())
        throw new AssertionError

    myAssert(() => 5 > 3)

    //myAssert(5 > 3) // Won’t work, because missing () =>

    /*
     byNameAssert参数会在函数调用之后在evaluated,而boolAssert会在函数调用之前先evaluated
     By contrast, because the type of byNameAssert ’s
predicate parameter is => Boolean , the expression inside the parentheses
in byNameAssert(5 > 3) is not evaluated before the call to byNameAssert .
Instead a function value will be created whose apply method will evaluate
5 > 3 , and this function value will be passed to byNameAssert .
     */
    def byNameAssert(predicate: => Boolean) =
      if (assertionsEnabled && !predicate)
        throw new AssertionError

    byNameAssert(5 > 3)
    byNameAssert(1 / 0 == 0)

    // 没有问题

    def boolAssert(predicate: Boolean) =
      if (assertionsEnabled && !predicate)
        throw new AssertionError

    boolAssert(5 > 3)
    boolAssert(1 / 0 == 0) // java.lang.ArithmeticException: / by zero
  }

  def main(args: Array[String]) {

  }

}


© 著作权归作者所有

共有 人打赏支持
谦谦君子
粉丝 37
博文 59
码字总数 50480
作品 0
成都
程序员
《programming in scala》2ed chap13学习笔记

scala的private访问权限 class Outer { class Inner { class InnerMost { f() // OK (new Inner).f } private[Outer] def d() { println("d") } private def f() { println("f") } (new Inne......

谦谦君子
2014/01/13
0
0
《programming in scala》2ed chap15学习笔记

package chap15 sealed abstract class Expr // 加了sealed,其他文件里不能extends Exprcase class Var(name: String) extends Exprcase class Number(num: Double) extends Exprcase clas......

谦谦君子
2014/01/14
0
0
Scala 的学习笔记系列(持续更新中)

最近学习 Scala,因它是灵活的函数式编程,还有就是能为 PlayFramework 2.0 服务,看的是 《Programming in Scala》 那本书,并记下自己认为值得记录的东西,列举 Scala 用元组/列表类型实现...

YanbinQ
2012/10/26
0
1
Spark 学习资源收集

(一)spark 相关安装部署、开发环境 1、Spark 伪分布式 & 全分布式 安装指南 http://my.oschina.net/leejun2005/blog/394928 2、Apache Spark探秘:三种分布式部署方式比较 http://dongxic...

openthings
2016/05/29
164
0
免费的计算机编程类中文书籍

免费的编程中文书籍索引,欢迎投稿。 国外程序员在 stackoverflow 推荐的程序员必读书籍,中文版。 stackoverflow 上的程序员应该阅读的非编程类书籍有哪些? 中文版 github 上的一个流行的编...

justjavac
2014/08/13
2.6K
10

没有更多内容

加载失败,请刷新页面

加载更多

#mysql50# not Exist

data 目录有中文名称,可能是复制的"复件...."

少年不搬砖老大徒伤悲
18分钟前
1
0
在yii2中,让你action参数支持POST数据的小方法

我们先来看一段代码 class RaController extends Controller { public $enableCsrfValidation = false; public function actionSay($username = '',$city = ''){ echo "{$......

阿北2017
27分钟前
2
0
macOS 10.14 Mojave

在近日发布的 macOS 10.14 Mojave 操作系统中,有人发现它(在某些机型中)悄然禁用了先前的「次像素平滑渲染」选项,导致部分(尤其是使用非高分辨率显示器)用户觉得字体比先前的更细更难看...

火力全開
32分钟前
1
0
 实现分布式锁的正确姿势

实现分布式锁的正确姿势 原理分析 最近看到好多博主都在推分布式锁,实现方式很多,基于db、redis、zookeeper。zookeeper方式实现起来比较繁琐,这里我们就谈谈基于redis实现分布式锁的正确实...

DemonsI
36分钟前
1
0
微信小程序 、支付宝小程序、百度小程序和钉钉e应用的汇总

2018年9月25日 百度小程序开放企业申请 微信小程序:现在微信小游戏都热火朝天了,而且已经有了云开发,包括提供的能力、文档、社区等都相对完善,也有相关的变现方式; 支付宝小程序:https...

to_be_better
39分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部