这是标准的Kotlin功能(据我所知)
inline fun<T> with(t: T, body: T.() -> Unit) { t.body() }
Run Code Online (Sandbox Code Playgroud)
但是,任何人都可以用简单的英文写下签名的意思吗?它是T的通用函数,第一个参数"t"表示类型T,第二个参数是函数类型的"body",接受函数???? 没有返回(单位)
我看到这个符号Something.() - >有些东西经常使用,即对于Anko:
inline fun Activity.coordinatorLayout(init: CoordinatorLayout.() -> Unit) = ankoView({ CoordinatorLayout(it) },init)
Run Code Online (Sandbox Code Playgroud)
但我不认为它在任何地方被解释了.()意味着......
根据以下源代码,似乎常规lambda可以与扩展lambdas互换.
fun main(args: Array<String>) {
val numbers = listOf(1, 2, 3)
filter(numbers, predicate)
filter(numbers, otherPredicate)
println("PREDICATE: ${predicate} " +
"\nOTHERPREDICATE: ${otherPredicate} " +
"\nEQUALITY: ${predicate==otherPredicate}")
}
val predicate : Int.() -> Boolean = {this % 2 != 0}
val otherPredicate : (Int) -> Boolean = {it % 2 != 0}
fun filter(list: List<Int>, predicate:(Int) -> Boolean) {
for(number in list){
if(predicate(number)){
println(number)
}
}
}
Run Code Online (Sandbox Code Playgroud)
输出(我关心),如下:
PREDICATE: kotlin.Int.() -> kotlin.Boolean
OTHERPREDICATE: (kotlin.Int) -> kotlin.Boolean
EQUALITY: false
Run Code Online (Sandbox Code Playgroud)
问题是为什么这些lambdas可以互换?不应该是不同的东西?编译器是否在做一些"聪明"的事情?
我正在看这个Kotlin对象声明:
object A : B({
variableName1 = "text1"
variableName2 = "text2"
params {
param("Foo", "Bar")
}
})
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚B类构造函数的参数是什么.
我有目的地在这个例子中抽象出信息,但实际上是B类
jetbrains.buildServer.configs.kotlin.v10.BuildType
Run Code Online (Sandbox Code Playgroud)
我找不到该类型的文档.我发现了一些接近的东西,但它是一个接口的定义,因此没有构造函数.
总而言之,Kotlin的以下构造是什么?
{
variableName1 = "text1"
variableName2 = "text2"
params {
param("Foo", "Bar")
}
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试轮询分页API并在用户出现时向其提供新项目.
fun connect(): Sequence<T> = buildSequence {
while (true) {
// result is a List<T>
val result = dataSource.getFirstPage()
yieldAll(/* the new data in `result` */)
// Block the thread for a little bit
}
}
Run Code Online (Sandbox Code Playgroud)
以下是示例用法:
for (item in connect()) {
// do something as each item is made available
}
Run Code Online (Sandbox Code Playgroud)
我的第一个想法是使用该delay功能,但我收到此消息:
受限制的挂起函数只能在其受限制的协程范围内调用成员或扩展挂起函数
这是签名buildSequence:
public fun <T> buildSequence(builderAction: suspend SequenceBuilder<T>.() -> Unit): Sequence<T>
Run Code Online (Sandbox Code Playgroud)
我认为这个消息意味着我只能使用suspendSequenceBuilder中的函数:yield并且不允许yieldAll使用任意suspend函数调用.
现在我在每次轮询API时使用它来阻止序列构建一秒钟:
val resumeTime …Run Code Online (Sandbox Code Playgroud)