scala之这种奇怪的类型[T*]
mfrbuaa
阅读:12
2024-11-24 20:56:43
评论:0
例如,我有以下函数连接开头和结尾,产生所有可能的连接变体作为结果:
def mixer1(begin: String, beginings: String*)(end: String, endings: String*) =
for (b <- (begin +: beginings); e <- (end +: endings)) yield (b + e)
其实函数做什么并不重要,我想这样改写:
def mixer2(begin: String, beginings: String*):Function2[String, Seq[String], Seq[String]] = {
return new Function2[String, Seq[String], Seq[String]] {
def apply(end:String, endings:Seq[String]) = for(b <- (begin +: beginings); e <- (end +: endings)) yield b+e
}
}
显然,第二个不会按预期工作,因为 apply 的第二个参数的类型为 Seq[String] 而不是 String*(但它们都编译为 Seq[String]):
scala> mixer1("a","b")("c","d")
res0: Seq[java.lang.String] = ArrayBuffer(ac, ad, bc, bd)
scala> mixer2("a","b")("c","d")
<console>:10: error: type mismatch;
found : java.lang.String("d")
required: Seq[String]
mixer2("a","b")("c","d")
我如何(如果可以)重新定义 mixer2 函数?
请您参考如下方法:
试试这个方法:
def mixer2(begin: String, beginings: String*) = {
new ((String, String*) => Seq[String]) {
def apply(end: String, endings: String*) = for(b <- (begin +: beginings); e <- (end +: endings)) yield b+e
}
}
我们在 mixer2
上使用类型推断来获取正确的类型。这意味着 return
必须被删除,但这没关系,因为它是不必要的(并且通常建议不要在 Scala 上使用)。最大的技巧是为 Function
使用 A => B
语法糖,以便能够使用 String*
。然后按预期更改 apply
。
声明
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。