2014-04-10 101 views
0

我与斯卡拉最近玩,但基本上这里就是我想铸造列表为String斯卡拉

//specify a pattern 
    val ptn = "(('[^']*')|([^,]+))".r 
    val test = "foo,bar,'foo,bar'" 
    pth.findAllmatchIn(test).toArray 



gives Array[scala.util.matching.Regex.Match] = Array(foo and bar, bar and foo, 'foo, is bar') 

我在回报希望是数组[字符串]?但我不想要一个额外的循环来进行类型转换。 因为我是scala的新手,所以我想知道是否有其他方法可以得到正则表达式的结果作为字符串? 谢谢

回答

1
ptn.findAllMatchIn(test).map(_.toString) 

有窍门。正如你所说的,你不需要额外的循环,而在Scala中,你通常可以在没有(显式)循环的情况下完成大部分任务。另外,在斯卡拉你通常想要坚持List而不是数组:.toList而不是.toArray

1

您可以通过findAllIn一步完成,它将返回一个迭代器,您可以将其强制为List。

ptn.findAllIn(test).toList 
2

你断然无法 “施展” 一ListString

了解铸造和转换之间的区别很重要。

转换是一种任意的计算,它可以从另一个值生成一个值,原始值和转换值类型之间没有必需的关系。

对于某些值,投射声明了不同的静态类型,只有当声明的类型实际上是正在投射的值类型之一时才会成功。 “向上”投射(到更宽的类型)总是成功,而投射到更窄的类型可能会失败。因此,将String转换为Object总是会成功,而将String转换为List将始终失败。事实上,除了斯卡拉的虚拟类型AnyRef之外,其他演员都不会成功,因为String是最后一个类,因此没有子类型。