当前位置: 首页 > 知识库问答 >
问题:

带T()的Kotlin函数签名是什么意思?

况承福
2023-03-14

这是一个标准的Kotlin函数(据我所知)

inline fun<T> with(t: T, body: T.() -> Unit) { t.body() }
inline fun Activity.coordinatorLayout(init: CoordinatorLayout.() -> Unit) = ankoView({ CoordinatorLayout(it) },init)

但我不认为它在任何地方解释什么。()意思是...

共有1个答案

顾高翰
2023-03-14

t()->unit是带有接收器的扩展函数类型。

除了普通功能,Kotlin还支持扩展功能。这种功能与普通功能的不同之处在于它有一个接收器类型规范。这里是一个通用的t部分。

扩展函数中的this关键字对应于receiver对象(在点之前传递的对象),因此可以直接调用它的方法(使用限定符仍然可以从父作用域引用this)。

/**
 * Calls the specified function [block] with the given [receiver] as its receiver and returns its result.
 *
 * For detailed usage information see the documentation for [scope functions](https://kotlinlang.org/docs/reference/scope-functions.html#with).
 */
public inline fun <T, R> with(receiver: T, block: T.() -> R): R = receiver.block()
val threadInfoString = with (Thread.currentThread()) {
    // isDaemon() & getPriority() are called with new property syntax for getters & setters
    "${getName()}[isDaemon=$isDaemon,priority=$priority]"
}


请参阅以下有关扩展函数的文档:
kotlinlang.org/docs/reference/lambdas.html#extension-function-expressions
kotlinlang.org/docs/reference/scope-functions.html#和kotlinlang.org/docs/reference/extensions.html

增加:

那么唯一有效的f将是为t定义的任何0参数函数?

// map() expects `(String) -> Int`
// argument has type `String.() -> Int`
strings.map(String::length)

因此,以下任何函数都适用于thread.()->string参数:

fun main(args: Array<String>) {
    val f1 = fun Thread.(): String = name
    val f2 = fun Thread.() = name
    val f3: Thread.() -> String = { name }
    val f4: (Thread) -> String = { it.name }
    val f5 = { t: Thread -> t.name }
    val f6: (Thread) -> String = Thread::getNameZ
    val f7: Thread.() -> String = Thread::getNameZ
    val f8 = Thread::getNameZ
}

fun Thread.getNameZ() = name

或者您可以简单地使用函数literal({}),就像示例中使用ThreadInfoString一样,但它仅在可以从上下文推断接收器类型时才起作用。

 类似资料:
  • 问题内容: 我想知道限制的含义是什么? 问题答案: 这是C99中引入的内容,它使编译器知道传入的指针与参数中的任何其他指针都没有指向相同的位置。如果向编译器提供此提示,则它可以进行一些更积极的优化而不会破坏代码。 例如,考虑以下功能: 显然,它从指针中添加了两个数字。如果需要,我们可以像这样使用它: 显然,它将输出8; 它本身增加了4。但是,如果我们添加到像这样: 那么以前的命令现在无效;它作为两

  • 问题内容: 我已经阅读了一段python代码,但我不知道和*在这段代码中是什么意思: 我只知道*的一种用法:将它具有的所有属性提取到方法或构造函数的参数中。 如果以上功能为真,那么其余的是什么:**? 问题答案: 在 函数头 里面: 收集元组中的所有位置参数。 收集字典中的所有关键字参数。 在 函数调用中 : 将列表或元组解压缩为位置参数。 将字典解压缩为关键字参数。

  • 问题内容: 我用Javassist创建了一个没有实际方法的构造函数 当我试图拿出这堂课的签名时 我懂了 我很困惑“ V”是什么意思?我期望任何一个公共Echo(); 或类似的东西 问题答案: JVM使用一种紧凑的方式来存储方法签名,其中的构造函数被认为是特例。 例如: 表示不带参数的方法 表示它什么也不返回 该计划的其他部分是: -字节 -字符 -双 -浮动 -整数 - 长 -短 -无效 -布尔值

  • 问题内容: 我在尝试找到答案时遇到了麻烦。我想知道语法和含义。我已经找到了一些信息,但是我不太了解使用该语法的目的。我正在寻找它的功能以及何时/为什么使用它的解释。 一个被使用的例子: 问题答案: 在函数调用的上下文中,将命名参数设置为空字符串。见函数; 是打印时多个值之间使用的分隔符。默认值是空格(),此函数调用可确保格式的浮点值和格式的浮点值之间没有空格。 比较以下三个调用的输出以查看区别 更

  • 我正在阅读Kotlin Coroutine并且知道它是基于函数的。但是是什么意思呢? Coroutine或函数挂起? 摘自https://kotlinlang.org/docs/reference/coroutines.html 哪一个被停职了? 摘自https://kotlinlang.org/docs/reference/coroutines.html 为了继续类比,await()可以是一个挂

  • 问题内容: 这样的方法声明有什么区别: 还有这个: 我的看法是,他们两个都指定传入的对象 必须 是type的子类,那么在这种情况下为什么还要烦恼泛型呢? 问题答案: 在您的情况下,差别不大。 但是请考虑以下几点: 在这种情况下,您可以通过以下方式调用该方法: 如果您使用 您将只能执行以下操作: