gpt4 book ai didi

scala - 为什么在未指定参数名称时 foreach 只执行一次?

转载 作者:行者123 更新时间:2023-12-03 18:39:56 25 4
gpt4 key购买 nike

我想执行一个函数三次。该函数恰好返回一个字符串。

def doThingReturnString(): String = {
println("Did a thing, returned a string.")
"abcdef"
}

(1 to 3).foreach { n =>
doThingReturnString()
}

(1 to 3).foreach {
doThingReturnString()
}

我希望两个循环都打印三行。相反,第一个循环打印三行,第二个循环打印一行。

Did a thing, returned a string.

Did a thing, returned a string.

Did a thing, returned a string.


Did a thing, returned a string.



为什么命名参数会导致循环只执行一次?

最佳答案

foreach期望函数 Int => U (其中 U 可以是“任何”)。时期。如果要忽略该参数,请使用下划线。

(1 to 3).foreach { _ => doThingReturnString() }

当你写
(1 to 3).foreach { doThingReturnString() }

大括号就像括号一样
(1 to 3).foreach(doThingReturnString())
foreach 的参数必须是 Int => U ,但在这里,它是一个 String .一个 String可以隐式转换为 Int => U , 因为一个 String可以 implicitly convert WrappedString ,将其视为集合类型,特别是 Seq[Char] ,可以向上转换为 PartialFunction[Int, Char] 从索引到元素,可以向上转换为 Int => Char .因此,你基本上写了
val temp = doThingReturnString()
(1 to 3).foreach { i => temp.charAt(i) }

这种行为的原因是处理 Seq[A] s 为 PartialFunction[Int, A] s 很明智。同样明智的是能够像其他集合类型一样处理字符串,因此我们有一个隐式转换来增强 Java 的 String使用 Scala 的集合架构。把它们放在一起,这样 String s变成 Int => Char s,产生一些令人惊讶的行为。

关于scala - 为什么在未指定参数名称时 foreach 只执行一次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57563834/

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