Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Function 在Kotlin中定义函数的不同方法_Function_Kotlin - Fatal编程技术网

Function 在Kotlin中定义函数的不同方法

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

我是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(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自动完成的功能弄得乱七八糟。或者它使用某个类的属性,因此必须在该类中定义它
当你只是在创作你自己的作品时