gpt4 book ai didi

lambda - 如何设计高阶函数

转载 作者:行者123 更新时间:2023-12-01 10:20:34 25 4
gpt4 key购买 nike

高阶函数的参数为​​任意一个

  • 函数类型或
  • 带有接收器的函数类型。

我们习惯于从 kotlin 的 stdlib 中filterwith:

@Test
fun `filter example`() {
val filtered = listOf("foo", "bar").filter {
it.startsWith("f")
}

assertThat(filtered).containsOnly("foo")
}

@Test
fun `with example`() {
val actual = with(StringBuilder()) {
append("foo")
append("bar")
toString()
}

assertThat(actual).isEqualTo("foobar")
}

filter 使用函数类型参数,with 使用函数类型参数 with receiver。所以传递给 filter 的 lambdas 使用 it 访问可迭代的元素,而传递给 with 的 lambdas 使用 this 访问StringBuilder。

我的问题:当我声明自己的高阶函数时,是否有经验法则使用哪种风格(it vs this)?


换句话说:为什么过滤不是那样设计的?

inline fun <T> Iterable<T>.filter2(predicate: T.() -> Boolean): List<T> = filter { it.predicate() }

如果它是这样定义的,我们会像这样使用它:

@Test
fun `filter2 function type with receiver`() {
val filtered = listOf("foo", "bar").filter2 {
// note: no use of it, but this
startsWith("f")
}

assertThat(filtered).containsOnly("foo")
}

最佳答案

我的经验法则如下:

每当我可能需要命名我的 lambda 参数时,我都会使用 (Type) -> Unit

如果我确定我不会命名它(所以从上下文中可以清楚地看出我操作的所有内容都是this)或者我什至想禁止命名(builder?),那么我使用 Type.() -> Unit

withapplyrun 都使用第二种方法……对我来说这是有道理的:

with(someString) {
toUpperCase() // operates on someString... already sounds like: "with some string (do) to upper case"
}
someString.run(::println) // run println with someString; actually: someString.run { println(this) } // e.g.: print this [some string]
// actually I find this a bad sample... I usually use run where the thing to be run is from the receiver...
SomeComplexObject().apply {
// apply being similar to a builder
complex1 = 3
complex2 = 4
}.run {
// fully constructed complex object
complexOperationWithoutReturnValue() // this method is part of SomeComplexObject
} // discarding everything here...

这是我使用第二种方法的示例:

fun sendMail(from : String, to : String, msgBuilder : MessageBuilder.() -> Unit)

sendMail("from", "to") {
subject("subject")
body("body")
}

使用 it 或参数(例如 builder ->)它只会变得更丑陋,它并没有真正为上下文添加任何东西......

关于lambda - 如何设计高阶函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53065732/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com