给定:
def readLines(x: String): List[String] = Source.fromFile(x).getLines.toList
def toKVMap(fName : String): Map[String,String] =
readLines(fName).map(x => x.split(',')).map { case Array(x, y) => (x, y) }.toMap
我希望能够获取一个字符串和替换文件列表并替换包围的项目。因此,如果我有:
replLines("Hello",["cat"])
和cat
包含ello,i!
,我想返回Hi!
我尝试了:
def replLines(inpQ : String, y : List[String]): String = y match {
case Nil => inpQ
case x::xs => replLines(toKVMap(x).fold(inpQ) {
case ((str: String), ((k: String), (v: String))) =>
str.replace("[" + k + "]", v).toString
}, xs)
}
我认为语法很接近,但不完全存在。我做错了什么?
您要寻找的很可能是这样(请注意foldLeft[String]
而不是fold
:
def replLines(inpQ: String, y: List[String]): String = y match {
case Nil => inpQ
case x :: xs => replLines(toKVMap(x).foldLeft[String](inpQ) {
case ((str: String), ((k: String), (v: String))) =>
str.replace("[" + k + "]", v)
}, xs)
}
fold
概括了折叠初始参数,并认为它为 Serializable
,而不是 String
。foldLeft
(和foldRight
,如果您喜欢从末端启动替换(允许您明确指定您在
编辑:实际上,您甚至根本不需要递归模式匹配,因为您可以将替代品直接映射到列表:
def replLines2(inpQ: String, y: List[String]): String =
y.flatMap(toKVMap).foldLeft[String](inpQ) {
case (str, (k, v)) => str.replace(s"[$k]", v)
}