Kotlin入门(二)——函数fun

来源:互联网 发布:文字变声音软件 编辑:程序博客网 时间:2024/05/18 00:53

官网

        官网链接。

定义

        函数通过fun关键字进行定义。

参数

        参数的定义形式为:name: type

参数默认值

        每一个参数都可以有默认值。如:

fun main(args:Array<String>){println(test(2))}fun test(a:Int,b:Int = 3):Int{//b的默认值是3,所以调用的时候可以只传一个值,该值会被赋值给a。return a+b}
        有默认值的参数也可以被赋值。同时也可以通过参数名=值的方式为指定的参数进行赋值。如:
fun main(args:Array<String>){reformat("hhh",wordSeparator="xxx")//为指定的参数进行赋值}fun reformat(str:String,    divideByCamelHumps:Boolean = false,    wordSeparator:String = "_"){println(str+wordSeparator+divideByCamelHumps)//hhhxxxfalse}

        reformat定义了三个参数,后面两个无默认值。在调用的时候,通过参数名为指定的wordSeparator参数进行赋值;而divideByCamelHumps没有被赋值,所以它的值是默认值。

可变参数vararg

        通过vararg关键字定义可变参数。可以将可变参数当作一个数组进行处理。要注意的是:一个函数只能有一个可变参数。但可变参数不一定是最后一个参数。如下:

fun test(vararg a:String,b:String){for(t in a){println(t)}println(b)}test("fdaf","fdaf2","fda3",b="00fdaf")//调用方式

        参数a为可变参数,但它并不是第一个参数。

        在调用时,通过参数名=值的方式为参数b进行赋值,不然赋的值会传递到可变参数a中。

        将上述kt文件编译成的class打开,可发现该函数对应的java代码如下:


        从中可以看出,可变参数a已经变成了String数组。

泛型

        通过<>指定泛型类型,并且泛型写在函数名之前。

函数

infix notation

        可以通过infix关键字定义一个函数,它需要满足以下条件:
        1,必须是成员函数或扩展函数
        2,必须是单参数的函数
        3,使用infix关键字。如下:
fun main(args:Array<String>){println("11".test("22"))}infix fun String.test(a:String):String{return this+a //使用this代表调用者的值}
        该功能相当于为String类型扩展了功能,每一个String类型都可以直接使用test函数。
        要注意:一定要在函数名之前指定要扩展功能的类。查看其对应的class文件如下:
        可以看出$receiver是String类型的,该类型就是函数名之前指定的类型。

top level函数

        Kotlin中,不需要将函数定义在一个类中(这样的函数叫top level函数),它可以直接定义到任何一个kt文件中——外层不需要包裹一层class。当然,这只是写法的区别,实际上在转成class文件之后,该函数依旧是一个类的成员函数。如下是一个a.kt的源码:

fun main(args:Array<String>){test("fdaf","fdaf2","fda3",b="00fdaf")}fun test(vararg a:String,b:String){for(t in a){println(t)}println(b)}

        test与main函数是没有定义到任何类的内部,打开该文件编译成的class文件,如下:

        可以发现在对应的java文件中,在外层生成了一个类名为AKt的类,并将所有的函数都定义到该类中。

局部函数(local function)

        一个函数可以定义在另一个函数的内容。如下:

fun test(vararg a:String,b:String){fun inner(i:String){//定义在另一个函数的内容println(i+","+b)}inner("___inner__")//直接调用该内容函数}

        查看其对应的class文件,可发现内部函数会被转成Lambda对象的成员函数。如下:


        从中也可以看出,局部函数也只有其外层的函数可以访问到,别的地方无法访问。

成员函数

        函数可以定义在一个类的内部。同java一样。

单语句函数

        当函数体只有一个表达式时,可以省略大括号,并将函数体定义在返回类型后面,并通过等号连接。如下:

fun test(a:Int,b:Int = 3):Int = a*b
        该函数的函数体只有一个表达式a*b,所以可以将大括号省略,并用等号连接。

        同时,该函数的返回值类型也可以省略。如下:

fun test(a:Int,b:Int = 3) = a*b//省略了返回值类型
        单语句函数不需要写return。

返回值

        返回值写在参数括号后面,以冒号分开。如下:

fun test(a:Int,b:Int = 3):Int{//返回Int类型return a+b}
        如果一个函数没有返回值,可以将它返回值类型写成Unit,并且该返回值类型可以省略。






























原创粉丝点击