[Scala学习之旅] Functions and methods

Functions and methods 是Scala中比较相似的概念,但它们的用法确有很大的不同。Methods大家都很熟悉了,即使是刚开始学习面向对象的年轻朋友,也都知道对象是由属性(attributes)和方法(methods)组成的,但对Functions未必能够理解到位, 所以我们的Scala学习之旅就从函数和方法 - Functions vs. methods 开始吧。

语法释义

Functions

A function is a callable unit of code

函数是可重用的代码块,可以传入零到多个参数,执行并返回结果,或者没有返回值。

Scala中函数的定义如下:

    // function
    val f0 = () => "scala function."
    val f1 = (x: Int) => x + x

Methods

方法就是我们Java或C++程序员都很熟悉的概念了,它是面向对象编程中类的组成部分,可以被继承,也可被重写,可以被调用。

Scala中方法的定义如下:

    // method
    def m0(): String = "scala method."
    def m1(x: Int): Int = x + x

最大差异

在scala中一切皆对象。 Method 与 Function 最大的差异是 Function是对象,所以它可以被赋值给变量,作为另一个Method或Function的参数传递,也可作为其返回值返回。

示例代码

package ddu.scala.function

/**
 * Scala中方法(Method)和函数(Function)的区别 
 */
object DifferenceBetweenFunctionsAndMethodsInScala {
  def main(args: Array[String]): Unit = {

    // == 定义 ==
    // method
    def m0(): String = "scala method."

    def m1(x: Int): Int = x + x

    // function
    val f0 = () => "scala function."
    val f1 = (x: Int) => x + x

    // == 调用 ==
    // method 和 function的调用方法相同,返回的结果也相同
    println(m1(50)) // 100
    println(f1(50)) // 100

    // 如果调用时侯不给定参数
    //  函数名是一个引用Function对象的变量,更进一步我们可以判断,
    //  f1 是 Function1[Int, Int] 或者 (Int) => Int 的一个实例.
    println(f0) // DifferenceBetweenFunctionsAndMethodsInScala$$$Lambda$15/0x0000000800c03000@52af6cff
    println(f0()) // scala function.
    println(f0.isInstanceOf[Function0[String]]) // true
    println(f0.isInstanceOf[() => String]) // true

    // 但是方法名总会被认为是对该方法的调用
    println(m0) // scala method.
    /*m1 // Missing arguments for method m1(Int) */

    // 如果有需要,我们可以用 _ 来把一个 Method 转换成 Function
    val methodToFunction = m1 _
    // 或者给定类型, 编译器会自动进行转换
    val methodToFunction2: Int => Int = m1
    println(methodToFunction(50)) // 100

    // == Method 独有特性 == 
    // Method 可以嵌套定义
    def outerMethod() = {
      def innerMethod() = {
        // inner method's statements here
      }

      // outer method's statements
      innerMethod()
    }

    // Default and Named Arguments
    // Method的参数可以有默认值, 可以按参数名来传递
    def sayHiTo(say: String = "Hi", name: String): Unit = {
      println(s"$say $name!")
    }
    sayHiTo(name = "Robby") // Hi Robby!

    // == Function 独有特性 == 

    // function 是对象,可以作为方法或者函数的参数
    def calculateMethod(x: Int, y: Int, operator: (Int, Int) => Int): Unit = {
      println(operator(x, y))
    }

    val add = (x: Int, y: Int) => x + y
    val subtract = (x: Int, y: Int) => x - y
    val multiply = (x: Int, y: Int) => x * y
    val divide = (x: Int, y: Int) => x / y
    calculateMethod(10, 2, add) // 12
    calculateMethod(10, 2, subtract) // 8
    calculateMethod(10, 2, multiply) // 20
    calculateMethod(10, 2, divide) // 5

    // calculateFunction 是一个 Higher-Order Functions
    // 所谓高阶函数(Higher-Order Functions),就是把另外一个函数作为参数或者返回值.
    val calculateFunction = (x: Int, y: Int, operator: (Int, Int) => Int) => println(operator(x, y))
    calculateFunction(10, 2, add) // 12
    calculateFunction(10, 2, subtract) // 8
    calculateFunction(10, 2, multiply) // 20
    calculateFunction(10, 2, divide) // 5

  }
}

总结

本文主要讨论了scala中Function和Method的主要异同点,当然Function做为Scala的重要概念,还有很多高阶用法,可以留待我们以后探讨学习。

Function和Method都是Scala中一段可以接收参数,进行计算并返回结果的可重用的代码块。

  • 如果你想把这段代码块赋值给变量,亦或当作参数或者返回值传递的话,那就去用Function,

  • 如果仅仅是为了 计算->返回, Method更为合适,毕竟Method还有参数默认值,参数按名传递等好用的功能

Reference

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

喝冰咖啡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值