zoukankan      html  css  js  c++  java
  • scala学习手记26

    函数值对消除代码重复有很大的帮助。但是像函数值这样直接将一个函数作为另一个函数的参数却不太利于函数值本身的重用。

    来看一个例子:

    class Equipment(val routine: Int => Int) {
      def simulate(input: Int) = {
        print("Running simulation...")
        routine(input)
      }
    }

    在这个例子里将函数值作为参数传到了构造器中。

    看一下如何使用:

    val equipment1 = new Equipment({input=>println("calc with " + input); input})
    val equipment2 = new Equipment(input=>{println("calc with " + input); input})
    
    equipment1.simulate(4)
    equipment1.simulate(6)

    执行结果如下:

    image

    上面的代码中还是出现了重复代码。新建实例equipment1和equipment2时,向Equipment构造函数中传递的函数值是一样的。要避免这样的函数值重复,可以将函数值赋给一个val,然后调用的时候直接使用val。就像下面这样:

    val calculate = { input: Int => println("calc with " + input); input }
    
    val equipment1 = new Equipment(calculate)
    val equipment2 = new Equipment(calculate)
    
    equipment1.simulate(4)
    equipment1.simulate(6)

    这里将函数值保存在一个val引用calculate中。请注意下,在这里需要声明函数值参数的类型。在之前是不需要的。那是因为scala可以推断出直接嵌入到函数中的函数值的参数类型。

    实际上scala还支持一种更地道的方式:在需要函数值的地方可以传入普通函数。所以如下的代码也是可以的:

    def calculate(input: Int) = {
      println("calc with " + input)
      input
    }
    
    val equipment1 = new Equipment(calculate)
    val equipment2 = new Equipment(calculate)

    这样看起来更自然些,是不是。

    就这样。

    ##########

  • 相关阅读:
    关于DB2 ORACLE MYSQL 数据库 where字句执行顺序问题
    关于图片上传的一些问题
    集合、迭代器的一些总结
    关于使用Echart记录
    DB2序列的使用
    (转载)判断浏览器类型是否IE及版本问题
    SQL中 IS NULL 和IS NOT NULL
    JS 中substr 和 substring
    (转载)身份证验证
    Echars 自适应浏览器大小
  • 原文地址:https://www.cnblogs.com/amunote/p/5712910.html
Copyright © 2011-2022 走看看