• 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)

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

    就这样。

    ##########

  • 相关阅读:
    C#创建资源文件
    C#基础-获得当前程序的 空间名.类名.方法名
    C# 事务
    sql作业
    获取IP和mac地址
    winform文本框不能粘贴、复制和屏蔽右键
    Linux的iptables常用配置范例(1)
    自动化运维工具Ansible详细部署
    rsync+inotify实现数据的实时备份
    leetCode(26):Unique Binary Search Trees
  • 原文地址:https://www.cnblogs.com/amunote/p/5712910.html
Copyright © 2020-2023  润新知