《Kotlin实战》——函数和变量

函数

从一个最经典的例子:Hello World 开始。我们写一个打印输出 Hello World 的函数:

fun main(args: Array<String>) {
    println("Hello World!")
}

从这个函数我们可以观察到一下几点:

  • Kotlin 使用关键字 fun 来定义函数
  • 参数的类型是写在名称后面
  • 函数的定义可以在文件的最外层,不需要把它放在类中
  • 数组的一个类
  • 使用 println代替 System.out.println。Kotlin 标准库给 Java 标准库提供了许多语法简介的包装
  • 代码结尾省略分号

上面的函数没有返回值,如果我们需要定义一个有返回值的函数,应该怎么做?

fun main(args: Array<String>) {
    println(max(2,3))
}

fun max(a: Int, b: Int): Int {
    return if (a > b) a else b
}

使用关键字 fun 定义一个函数,输入两个参数,参数后面是我们需要的返回值类型,之间用:隔开。所以,上面两个例子我们基本可以总结出来 Kotlin 函数的基本格式:

fun 函数名称(参数名称:参数类型):返回值类型 {
    函数体
}

表达式函数体

大家有没有注意到上面的 if 表达式。在 Kotlin 中,if 是表达式,不是语句。那么表达式和语句的区别是什么呢?表达式和语句的区别在于:表达式有值,并且能作为另外一个表达式的一部分使用;而语句总是包围着它的代码块中的顶层元素,并且没有自己的值。在 Java 中,所有的控制结构都是语句,而在 Kotlin 中,除了循环(for、while、do/while)以外,大多数控制结构都是表达式。

另一方面,Java 中的赋值操作都是表达式,在 Kotlin 中反而都成了语句。这有助于避免比较和赋值之间的混淆。

那么,什么是表达式函数体?我们可以把上面的函数改写成下面的样子:

fun max(a: Int, b: Int): Int = if (a > b) a else b

可以看到,它的函数体由单个表达式构成,可以用这个表达式作为完整的函数体,并且去掉花括号和 return 语句的。如果这个函数卸载花括号中,我们说这个函数有代码块体;如果它直接返回了一个表达式,它就有表达式体。

我们还可以进一步简化上述函数:

fun max(a: Int, b: Int) = if (a > b) a else b

可以看到,我们省略了返回值类型。为什么这里可以省略返回值类型?作为一门静态类型语言,Kotlin 不是要求每个表达式都应该在编译期具有类型吗?事实上,每个变量和表达式都有类型,每个函数都有返回类型。但是对于表达式体函数来说,编译器会分析作为函数体的表达式,并把它的类型作为函数的返回类型,这种分析通常被称为类型推导。

变量

Kotlin 变量的定义是以关键字开始,然后是变量名称,然后是类型,然后是变量值:

val min : Int = 20

当然如果变量已经初始化,我们可以省略类型:

val min = 20
val question = "May I help you?"

和表达式体函数一样,如果不指定变量类型,编译器会分析初始化值,把它的类型作为变量的类型。如果变量没有初始化,需要显式的指名类型

var answer : Int

关键字

  • val:不可变引用。使用 val 声明的变量不能在初始化之前再次赋值
  • var:可变引用。这种变量的值可以被改变。

尽管 val 引用自身是不可变的,但是它指向的对象可能是可变的,例如:

val languages = arrayListOf("Java")
languages.add("Kotlin")

var 关键字允许变量改变自己的值,但是它的类型是改变不了的。例如下面代码会编译报错:

var min = 20
min = "min"

字符串模板

直接看下面的一种表达方式:

val name = if (!args.isEmpty()) args[0] else "Kotlin"
println("Hello $name!")

这种表达方式介绍了一个新特性:字符创模板。和许多脚本语言一样,Kotlin 让你可以在字符串字面值中引用局部变量,只需要在变量名称面前加上 使 字符,需要进行转义:

println("\$x")

我们还可以使用更复杂的表达式,而不仅仅限于变量名称,这个时候需要使用花括号把表达式括起来:

println("Hello ${if (!args.isEmpty()) args[0] else "Kotlin"}!")

猜你喜欢

转载自blog.csdn.net/lichengcai2015/article/details/80089928