【问题标题】:How to create package-level functions?如何创建包级函数?
【发布时间】:2016-12-11 06:11:46
【问题描述】:

我正在阅读the Kotlin Reference Guide,其中一部分说:

在 Kotlin 中,与 Java 或 C# 不同,类没有静态方法。在大多数情况下,建议只使用包级函数。

如何创建包级函数?

【问题讨论】:

    标签: function kotlin


    【解决方案1】:

    包级函数

    包级函数也称为顶级函数。它们直接在文件中声明,而不为它们创建任何类。它们通常是独立于任何类的实用函数:

    UserUtils.kt

    package com.app.user
    
    fun getAllUsers() { }
    
    fun getProfileFor(userId: String) { }
    

    用法:

    import com.app.user.getProfileFor
    
    val userProfile = getProfileFor("34")
    

    您无需手动编写import 语句,只需键入函数名称,自动导入即可完成工作。


    带有类的包级函数

    当函数与某个类有些相关时,将它们定义在类的上方,在同一个文件中:

    User.kt

    package com.app.user   
    
    fun getAllUsers() { }
    
    fun getProfileFor(userId: String) { }
    
    data class User(val id: String, val name: String)
    

    用法:

    import com.app.user.getAllUsers
    
    val userList = getAllUsers()
    

    companion object

    当函数与类密切相关时,在companion object 中定义它们:

    User.kt

    data class User(val id: String, val name: String) {
    
        companion object {
    
            fun getAll() { }
    
            fun profileFor(userId: String) { }
        }
    }
    

    用法:

    import com.app.user.User
    
    val userProfile = User.profileFor("34")
    

    就是这样!

    【讨论】:

      【解决方案2】:

      From the reference:

      源文件的所有内容(例如类和函数)都包含在声明的包中。

      所以只需像这样创建一个源文件:

      package my.pkg
      
      fun f0()=0
      fun f1()=1
      

      我们可以声明名为f0f1 的函数对my.pkg 包直接可见。然后可以像类一样导入和使用这些函数:

      import my.pkg.f0
      import my.pkg.f1
      

      或者,使用* 语法:

      import my.pkg.*
      

      【讨论】:

      • 真的吗?从kotlinlang.org/docs/reference/visibility-modifiers.html,我读到:函数、属性和类、对象和接口可以在“顶级”上声明,即直接在包内:...如果您不指定任何可见性修饰符,则 public 由默认值,这意味着您的声明将在任何地方可见;
      • 奇怪的是,只有当我在 IntelliJ IDEA 中这样做时,这件事才对我有用。如果我从 kotlinc kotlinc main.kt -include-runtime -d main.jar && java -jar main.jar 运行相同的代码,我会收到 unresolved reference 错误。
      • @IvanTemchenko 我遇到了同样的问题。有什么解决办法吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-29
      • 1970-01-01
      • 2021-09-13
      • 1970-01-01
      • 1970-01-01
      • 2016-02-01
      • 2022-11-21
      相关资源
      最近更新 更多