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


标签:Scala
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号