gpt4 book ai didi

Scala 循环有多个条件 - 返回什么?

转载 作者:行者123 更新时间:2023-12-02 15:19:51 25 4
gpt4 key购买 nike

我正在为不耐烦的人浏览 Scala,遇到了一个我似乎无法理解的多条件循环示例。

来自 Java 背景,我将这些循环视为嵌套的 for 循环。但为什么第一个返回一个 collection 而第二个返回一个 String

scala> for (i <- 0 to 1; c <- "Hello") yield (i + c).toChar
res11: scala.collection.immutable.IndexedSeq[Char] = Vector(H, e, l, l, o, I, f, m, m, p)

scala> for (c <- "Hello"; i <- 0 to 1) yield (i + c).toChar
res12: String = HIeflmlmop

最佳答案

for comprehensions 只是语法糖,被翻译成调用 mapflatMapwithFilter(还有 foreach 如果你不使用 yield)。

for {
i <- 0 to 1
c <- "Hello"
} yield (i + c).toChar

相当于

(0 to 1).flatMap(i => "Hello".map(c => (i + c).toChar))

这些转换器的定义方式是它们返回与它们调用时相同类型的集合,或者最接近的集合,例如这里的 Range 变成了 Vector结束,因为您不能拥有包含任意字符的 Range。从 String 开始,您仍然可以返回 String

一般来说,您可以这样想:for comprehension 创建的结果类型将与第一个生成器的类型相同(或最接近的可能)。

例如,如果您将字符串转换为 Set

for {
c <- "Hello".toSet[Char]
i <- 0 to 1
} yield (i + c).toChar

你会得到一个 Set ,因为它是一个集合,它不会包含重复项,所以结果是不同的。 集合(e, f, m, I, l, p, H, o)

确定类型的方式涉及 CanBuildFrom 特征。您可以阅读更多有关其工作原理的信息 here

关于Scala 循环有多个条件 - 返回什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37944095/

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