文档章节

《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]) {

  }

}


© 著作权归作者所有

共有 人打赏支持
谦谦君子
粉丝 38
博文 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

没有更多内容

加载失败,请刷新页面

加载更多

配置防盗链、访问控制Directory、访问控制FilesMatch

11月19日任务 11.25 配置防盗链 11.26 访问控制Directory 11.27 访问控制FilesMatch 通过限制referer来实现防盗链的功能 配置文件增加如下内容 <Directory /data/wwwroot/www.123.com> SetE...

zgxlinux
10分钟前
2
0
docker搭建redis环境

docker 搭建redis单机,主从,哨兵,集群环境: https://github.com/grace-233/docker-config-file/tree/master/redis...

grace_233
18分钟前
2
0
机器学习:从入门到晋级

摘要: 什么是机器学习,为什么学习机器学习,如何学习机器学习,这篇文章都告诉给你。 目前,人工智能(AI)非常热门,许多人都想一窥究竟。如果你对人工智能有所了解,但对机器学习(Machi...

阿里云官方博客
23分钟前
3
0
FFT数据为空

项目地址:https://github.com/zhangjianli/FlutterMusicPlugin

whoisliang
29分钟前
1
0
python中.whl文件下载,pandas

安装pandas一直报错,最后找到了这个网址,成功安装,分享一下给大家,下载的时候需要注意下载对应的python版本和电脑系统的whl文件 https://www.lfd.uci.edu/~gohlke/pythonlibs/ 这上面有很...

上官夏洛特
43分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部