Kotlin入门(二)——函数fun
2017-05-22 15:49
211 查看
官网
官网链接。定义
函数通过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,并且该返回值类型可以省略。
相关文章推荐
- Kotlin入门(9)函数的基本用法
- Kotlin快速入门(2) -- 函数
- kotlin入门(八)函数
- kotlin开发Android入门篇六Lambda与高级函数
- Kotlin入门篇(二),如何声明函数和处理空值
- Kotlin学习与实践 (三)fun 函数
- Kotlin入门(9)函数的基本用法
- Kotlin的变量、函数fun
- AJAX入门之深入理解JavaScript中的函数
- 消息钩子函数入门篇
- javascript入门·向函数传递表单数据和元素(赠送一小技巧)
- AJAX入门之深入理解JavaScript中的函数
- js入门·循环与判断/利用函数的简单实例/使用对象/列举对象属性的名称
- pl/sql入门第三章--单行函数和组函数
- [NET]Net中的反射使用入门(根据类名和函数名,生成和调用对象的成员函数)
- Visual Studio 2005入门 之 函数兼本章总结 [视频]
- AJAX入门之深入理解JavaScript中的函数
- AJAX入门之深入理解JavaScript中的函数
- C语言初学者入门讲座 第十讲 函数(5)
- 挑战30天C++入门极限-exit()与return()函数的差别