kotlin学习- 方法 fun

kotlin的方法和 typescript 的方法非常类似,可以说是一模一样

方法定义

关键词fun 类似 python里的 def, typescript里的 function a,b 就是2个参数 a,b 后面的冒号后面的 Int 是参数的类型, 和 typescript的类型定义一样, 和 python的 type hints 一样 括号后面的冒号后面的Int 是函数的返回值类型

 
fun sum(a: Int, b: Int): Int {
    return a + b
}

方法调用

fun main() {
    sum(1, 2)  // 这样就可以调用刚才定义的方法了
    println(sum(1, 2)) // 使用println打印出方法的返回值
}

有默认值的参数

给参数设置默认值,这样在调用方法的时候,就可以不用传递这个参数了 这里给参数a,b分别默认传入了 0

fun sum(a: Int = 0, b: Int = 0): Int {
    return a + b
}
 
fun main() {
 
    println(sum()) // 会输出 0, 因为a,b都是默认值0
    println(sum(1)) // 会输出 1, 因为a是1,b是默认值0,  只传入一个值的时候,默认会分配给第一个参数 a
    println(sum(1, 2)) // 会输出 3, 因为a是1,b是2
    println(sum(b = 2)) // 会输出 2, 因为a是默认值0,b是2, 这里使用了命名参数,指定了b的值
    println(sum(b = 2, a = 3)) // 会输出 5, 因为a是3,b是2, 这里使用了命名参数, 指定了a,b的值, 先给b指定值,再给a指定值,使用命名参数的时候,传值的顺序不重要
 
}

参数的长度可变、自适应

类似python里的可变参数 *args, typescript里的 剩余参数 ...args

// 可变长参数
// 接受任意长度的Int类型的参数,这些参数会被自动组装成一个数组
fun sum2(vararg args: Int) {
    println(args.toList())
}
 
fun main(){
    sum2(1,2,3,4) // 输出 [1, 2, 3, 4], 可以传入任意个参数
}

没有返回值的函数

这2个函数完全等价,都是没有返回值的函数

// 如果函数没有返回值,那就可以啥都不写(即不写 : Unit ),这里为了演示就写出来了
fun printSum(a: Int, b: Int): Unit {
    println(a + b)
}
 
// 如果函数没有返回值,那就像这样,括号后面不写冒号,也不写Unit,这样省事
fun printSum2(a: Int, b: Int) {
    println(a + b)
}

函数的返回值是可以省略的(通常情况,它会自动推断)

不是特别花里胡哨的,都可以推断,花里胡哨的我也不知道它能不能推断出来

 
// 显式的、手动的定义了返回值是 Int
fun sum2(a: Int, b: Int): Int {
    return a + b
}
 
 
// 没有定义返回值,但kotlin会根据函数体里面的代码,自动推断出返回值是 Int,这有时候可以让我们偷懒,
//(但我觉得最好是写上,为了让代码更健壮,万一习惯了偷懒,遇到它不能推断的情况,就可能会出bug,或许是我杞人忧天)
fun sum2(a: Int, b: Int) {
    return a + b
}
 
 

单表达式函数

如果函数内部只有一个表达式,那就可以不写花括号,不写 return,直接写表达式

感觉和 JavaScript 的箭头函数一样, 只是写法不同

下面这2个函数等价

fun sum(a: Int, b: Int): Int = a + b
 
fun sum2(a: Int, b: Int): Int {return a + b}
 
 

infix 中缀表示法

这个我感觉有些类似python里的魔法函数,但这个似乎更高级、更牛逼 这个可以用来自己创造一些语法,总之很强大,我以后要好好研究一下

// 让String类支持equalsIgnoreCase 来对比字符串是否相等,切忽略大小写
infix fun String.equalsIgnoreCase(other: String): Boolean {
    // 这里是this就是前面的值,也就是下方的 str1,other就是后的值,也就是str2
    return this.equals(other, ignoreCase = true)
}
fun main() {
    val str1 = "helLo"
    val str2 = "HELLO"
    val str3 = "HELLO"
    println(str1 == str2) // 输出:false 因为大小写不一样,不相等
    println(str2 == str3) // 输出:true,因为大小写一样,相当
 
    println(str1 equalsIgnoreCase str2) // 输出:true,因为忽略大小写的情况下,他们是相等的
    println(str1.equalsIgnoreCase(str2))// 输出:true,等价于上面的写法
}