Scala-函数

  • Scala 有函数和方法,二者在语义上的区别很小。Scala 方法是类的一部分,而函数是一个对象可以赋值给一个变量。换句话来说在类中定义的函数即是方法

  • 可以在任何地方定义函数,甚至可以在函数内定义函数(内嵌函数)

  • Scala 函数名可以有以下特殊字符:+, ++, ~, &,-, -- , \, /, : 等。

声明

def functionName([参数列表]) : [返回值类型]

定义

def functionName ([参数列表]) : [返回值类型] = {
  // function body
  return [expr]
}

示例

// Code
object FunctionExample {

    def main(args: Array[String]): Unit = {
        println(addInt(1, 2))
    }

    def addInt(a:Int, b:Int) : Int = {
        var sum:Int = 0
        sum = a + b
        return sum    // 这里去掉 return 也可以
    }
}

// Output
3

函数传名调用和传值调用

Scala的解释器在解析函数参数(function arguments)时有两种方式:

  • 传值调用(call-by-value):先计算参数表达式的值,再应用到函数内部

  • 传名调用(call-by-name):将未计算的参数表达式直接应用到函数内部

// 代码
object FunctionExample {
    def main(args: Array[String]): Unit = {
        delayedByName(time())
        println("\n" + "*" * 30 + "\n")
        delayedByValue(time())
    }

    def time(): Long = {
        println("获取时间")
        System.nanoTime
    }

    // 传名调用
    def delayedByName(t: => Long): Long = {
        println("In delayedByName")
        t
    }

    // 传值调用
    def delayedByValue(t: Long): Long = {
        print("In delayedByValue")
        t
    }
}

// 输出
In delayedByName
获取时间

******************************

获取时间
In delayedByValue

/* 说明
 delayed 方法中,在变量名和变量类型使用 => 符号来设置传名调用
 */

调用时指定参数名

object TestAA {
    def main(args: Array[String]): Unit = {
        def sub(a:Int, b:Int): Int = {
            a - b
        }

        println(sub(b = 4, a = 10))
    }
}

// 输出
6

可变参数

object TestAB {
    def main(args: Array[String]): Unit = {
        def varParams(a:Int, ss:String*) = {
            var res = "" + a + "\t"
            for (s <- ss) {
                res += s + "\t"
            }
            res
        }
        println(varParams(1, "hello", "world"))
    }
}

// 输出
1    hello    world

默认参数值

object TestAA {
    def main(args: Array[String]): Unit = {
        def sub(a:Int=20, b:Int): Int = {
            a - b
        }

        println(sub(b = 4, a = 10))
        println(sub(b = 4))
    }
}

// 输出
6
16

闭包

  • 闭包是一个函数

  • 返回值依赖于声明在函数外部的一个或多个变量

最后更新于

这有帮助吗?