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)

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

    就这样。

    ##########

  • 相关阅读:
    N皇后
    水域大小
    1221 分割平衡字符串
    1391 检查是否存在有效路径 DFS
    盛最多水的容器11 双指针
    烧饼排序
    每日日报8——软件设计④|抽象工厂模式(人与肤色)
    每日日报5——登录功能的实现(JAVA)
    每日日报4——软件设计②|简单工厂模式(女娲造人)
    vue利用transition过渡动画实现轮播图
  • 原文地址:https://www.cnblogs.com/amunote/p/5712910.html
Copyright © 2011-2022 走看看