Function 在Kotlin中定义函数的不同方法
我是Kotlin的新手,从Java迁移过来。我认为有一点让人困惑的是,我们可能会用不同的方式声明函数。下面至少有三种方法可以实现这一点:Function 在Kotlin中定义函数的不同方法,function,kotlin,Function,Kotlin,我是Kotlin的新手,从Java迁移过来。我认为有一点让人困惑的是,我们可能会用不同的方式声明函数。下面至少有三种方法可以实现这一点: package me.bruno.santana class MyClass { fun square(number: Int) = number * number fun square2(number: Int): Int{ return number * number } } fun MyClass.square3
package me.bruno.santana
class MyClass {
fun square(number: Int) = number * number
fun square2(number: Int): Int{
return number * number
}
}
fun MyClass.square3(number: Int) = number * number
fun main(){
val obj = MyClass()
println(obj.square(3))
println(obj.square2(3))
println(obj.square3(3))
}
这三种方法在实际应用中有什么区别?我知道最后一个与可拓函数概念有关,但我不知道它在实际应用中与传统方法有什么不同
另一件对我来说很奇怪的事情是函数定义中的赋值(使用等号将函数体与函数签名相关联)。它与Java中使用花括号的传统方式有什么不同吗
谢谢。1。这是一个单表达式函数:
- 当函数返回单个表达式时,可以省略大括号,并在=符号后指定主体
- 当编译器可以推断返回类型时,显式声明返回类型是可选的:
fun square(数字:Int)=数字*数字
2.这是正常的功能
可以有单行或多行以及所需的返回类型(但Unit
是可选的):
fun square2(数字:Int):Int{
返回编号*编号
}
3.这是扩展功能:
- Kotlin提供了使用新功能扩展类的能力,而无需从类继承或使用设计模式(如Decorator)
- 扩展是静态解析的:扩展实际上并不修改它们扩展的类。通过定义扩展,您不会向类中插入新成员,而只是使新函数可以在这种类型的变量上用点表示法调用
- 通常用于编写实用程序函数,并通过
增强可读性点符号
- 如果在其接收方类型之外声明扩展,则此类扩展无法访问接收方的私有成员
fun MyClass.square3(数字:Int)=数字*数字
1。这是一个单表达式函数:
- 当函数返回单个表达式时,可以省略大括号,并在=符号后指定主体
- 当编译器可以推断返回类型时,显式声明返回类型是可选的:
fun square(数字:Int)=数字*数字
2.这是正常的功能
可以有单行或多行以及所需的返回类型(但Unit
是可选的):
fun square2(数字:Int):Int{
返回编号*编号
}
3.这是扩展功能:
- Kotlin提供了使用新功能扩展类的能力,而无需从类继承或使用设计模式(如Decorator)
- 扩展是静态解析的:扩展实际上并不修改它们扩展的类。通过定义扩展,您不会向类中插入新成员,而只是使新函数可以在这种类型的变量上用点表示法调用
- 通常用于编写实用程序函数,并通过
增强可读性点符号
- 如果在其接收方类型之外声明扩展,则此类扩展无法访问接收方的私有成员
fun MyClass.square3(数字:Int)=数字*数字
添加一些关于扩展函数的内容:我可以想到使用它们的四个常见原因
- 您无法控制要向其中添加函数的类的源代码
- 您只想将函数添加到类的特定类型实例。例如,您可以为
类编写一个只在Foo
实例上可用的函数Foo
- 您希望向界面添加类似于
函数的内容。这在标准库中经常使用。如果在接口内定义函数,其行为是不可预测的,因为接口函数不能是最终函数。通过在接口外部将其声明为扩展,可以隐藏它(通过使用相同的签名编写不同的扩展函数),但不能重写它。隐藏它仍然需要用户导入函数的其他版本,因此必须显式执行final
- 您希望限制所添加函数的范围。也许这个函数只在特定的上下文中才有意义,所以你不希望它把IDE自动完成的功能弄得乱七八糟。或者它使用某个类的属性,因此必须在该类中定义它
当您只是编写自己的一个典型类时,您不需要经常使用扩展函数。要添加一些关于扩展函数的内容:我可以想到使用它们的四个常见原因
- 您无法控制要向其中添加函数的类的源代码
- 您只想将函数添加到类的特定类型实例。例如,您可以为
类编写一个只在Foo
实例上可用的函数Foo
- 您希望向界面添加类似于
函数的内容。这在标准库中经常使用。如果在接口内定义函数,其行为是不可预测的,因为接口函数不能是最终函数。通过在接口外部将其声明为扩展,可以隐藏它(通过使用相同的签名编写不同的扩展函数),但不能重写它。隐藏它仍然需要用户导入函数的其他版本,因此必须显式执行final
- 您希望限制所添加函数的范围。也许这个函数只在特定的上下文中才有意义,所以你不希望它把IDE自动完成的功能弄得乱七八糟。或者它使用某个类的属性,因此必须在该类中定义它