zoukankan      html  css  js  c++  java
  • Scala中function的理解

    在函数式语言中,函数是和value一样地位的一等公民,他可以作为变量,或者作为参数传递给另一个函数

    ##作为变量
    val f=(x:Int)=>x+1
    为啥可以这样写?
    由于scala是OOP,所以function也是个object。各个function都是继承了Function类,比如Function1类表示参数是1的function类。
     
    可见上述f是一个Function1的实例。所以作为实例的f有Function1的所有方法,其中有一个是apply方法,就是当f(1)的时候就会自动调用Function1的x+1这个方法。
    这个时候怎么又来了个方法(method),函数和方法的区别是什么?
    ###function 和method的区别
    可以说函数(function)是class,而method就是class中的一个函数(这个函数是指Java上的概念)。为啥呢,上面说了,各个function都是从Function继承过来的,那么每个function都有一个特定的method,这个method是啥呢,就是能体现这个function真正作用的method,比如上面的就是x+1,只不过被Function类用apply包装了。我们可以 想象成:
    object myFunction extends Function1(){
        ...
        apply(x:Int):Int=x+1
        ...
    }
    那么val f=(x:Int)=>x+1其实就是val f=new myFunction()
    所以f(1)=f.apply(1)
    所以,结论就是,函数的概念是大于方法的,函数其实本质是class,他是包含了方法的。
    所以在理解了Function其实是class后,能很好的理解函数为什么可以作为变量了,其实f就是这个Function的一个实例而已。
    ###关于Function与method的转换
    method转为Function
    定义了一个g方法,那么如何将方法转为函数呢
    可以通过_来实现
    val h=g _
    这样h就成了一个实例了。
    >关于下划线_的作用
      1. 作为“通配符”,类似Java中的*。如import scala.math._
      2. :_*作为一个整体,告诉编译器你希望将某个参数当作参数序列处理!例如val s = sum(1 to 5:_*)就是将1 to 5当作参数序列处理。
      3. 指代一个集合中的每个元素。例如我们要在一个Array a中筛出偶数,并乘以2,可以用以下办法:a.filter(_%2==0).map(2*_)。
      又如要对缓冲数组ArrayBuffer b排序,可以这样:
      val bSorted = b.sorted(_
      4. 在元组中,可以用方法_1, _2, _3访问组员。如a._2。其中句点可以用空格替代。 
      5. 使用模式匹配可以用来获取元组的组员,例如
      val (first, second, third) = t
      但如果不是所有的部件都需要,那么可以在不需要的部件位置上使用_。比如上一例中val (first, second, _) = t
      6. 还有一点,下划线_代表的是某一类型的默认值。
      对于Int来说,它是0。
      对于Double来说,它是0.0
      对于引用类型,它是null。
      7.  用于将方法转换成函数,比如val f=sqrt _,以后直接调用f(250)就能求平方根了
     
    ##作为参数传递
    定义了一个fun方法,里面的参数有两个一个是int型的x,一个是参数为int,返回值是int类型的函数f(感觉和C语言中的函数指针有点像)
    那么如何往里面传值呢,其实这里传的还是一个变量,只是这个变量是Function的实例。上面分析了method可以转换为Function,所以这里至少有两种方法。
    1. 直接传一个变量,比如val m=(x:Int)=>x+1
    接着
    2. 传一个方法(当然这个方法的参数和返回值需要满足上述条件)
    接着
    这个能成功运行,说明这里有一个隐性的转换机制。
     
    >=>的作用
    在Function中,表示将左边的转为右边的
    val triple=(x:Double)=>3*x
    将函数作为参数
    def fun(f:(Double)=>Double)=f(0.25)
    这里表示fun函数接受一个f函数作为参数,这里的f类型是(Double)=>Double表示输入为Double,输出为Double的函数
     
  • 相关阅读:
    Azure PowerShell (2) 修改Azure订阅名称
    Windows Azure Platform Introduction (11) 了解Org ID、Windows Azure订阅、账户
    Azure PowerShell (3) 上传证书
    Azure PowerShell (1) PowerShell入门
    Windows Azure Service Bus (2) 队列(Queue)入门
    Windows Azure Service Bus (1) 基础
    Windows Azure Cloud Service (10) Role的生命周期
    Windows Azure Cloud Service (36) 在Azure Cloud Service配置SSL证书
    Android studio 使用心得(一)—android studio快速掌握快捷键
    android 签名、混淆打包
  • 原文地址:https://www.cnblogs.com/sunrye/p/5256687.html
Copyright © 2011-2022 走看看