gpt4 book ai didi

Scala Extractor unapply 调用了两次

转载 作者:行者123 更新时间:2023-12-01 11:04:59 26 4
gpt4 key购买 nike

我刚刚发现我的提取器中的 unapply 出于某种原因被调用了两次。任何人都知道为什么,以及如何避免它?

val data = List("a","b","c","d","e")

object Uap {
def unapply( s:String ) = {
println("S: "+s)
Some(s+"!")
}
}

println( data.collect{ case Uap(x) => x } )

这会产生输出:

S: a
S: a
S: b
S: b
S: c
S: c
S: d
S: d
S: e
S: e
List(a!, b!, c!, d!, e!)

最终结果很好,但在我的真实程序中,unapply 是非常重要的,所以我当然不想调用它两次!

最佳答案

collect 将 PartialFunction 作为输入。 PartialFunction 定义了两个关键成员:isDefinedAtapply。当 collect 运行您的函数时,它会运行您的提取器一次,以确定您的函数是否 isDefinedAt 某些特定输入,如果是,那么它会作为 apply 的一部分再次运行提取器提取值(value)。

如果有正确实现 isDefinedAt 的简单方法,您可以通过显式实现您自己的 PartialFunction 来自行实现,而不是使用 case 语法。或者你可以做一个 filter 然后 map 与集合上的总函数(这实际上是 collect 通过调用 isDefinedAt 所做的,然后应用)

另一种选择是将部分函数提升为总函数。 PartialFunction 定义将 PartialFunction[A,B] 转换为 A=>Option[B]lift。您可以使用这个提升函数(称它为 fun)来执行:data.map(fun).collect { case Some(x) => x }

关于Scala Extractor unapply 调用了两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17049492/

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