[我正在尝试学习功能性Scala并解决一个简单的问题-替换出现在字符串中的\'
或\\
:
到目前为止是我的代码:
val data : String = "\' this is a test \\ "
data.toCharArray.foldLeft(""){ (x, y) => x match {
case Nil => y :: Nil
case head :: tail =>
if head == '\'' ''
else if head == '\\' ''
else head :: tail
}
存在多个错误:
我不了解折叠的基本原理?
foldLeft的简单示例,例如:
val sum = prices.foldLeft(0.0)(_ + _)
是可以理解的,但是我不确定在有条件的情况下如何使用foldLeft。在这个问题中,我发布了一个字符匹配的条件。
此代码中有几个错误:
List
模式匹配,因为x
这是到目前为止的结果(因此最初是""
,而y
是数据(字符)的元素]此代码应如下所示:
val data : String = "\' this is a test \\ "
data.toCharArray.foldLeft("") { (result, ch) =>
if (ch == '\'' || ch == '\\') result
else result + ch
}
这里有几个问题,首先是一些语法问题,例如缺少条件句的括号。第一个真正的实质性问题是,初始值(""
中的foldLeft("")
)必须与累加器相同,并且必须与返回类型相同。您似乎希望将List[Char]
作为返回类型,因此您需要使用List.empty[Char]
这样的初始值。
接下来,我强烈建议使用acc
和c
之类的名称代替x
和y
,以便更清楚地指示哪个是累加器,哪个是当前值。
另一个问题是''
也是无效的Scala语法-没有空字符文字。仅出于示例目的,我将使用'_'
作为替代。
有效的实现可能看起来像这样:
val data: String = "\' this is a test \\ "
data.toCharArray.foldLeft(List.empty[Char]) { (acc, c) =>
c match {
case '\'' => acc :+ '_'
case '\\' => acc :+ '_'
case other => acc :+ other
}
}
哪个产量:
val data: String = "' this is a test \ "
val res1: List[Char] = List(_, , t, h, i, s, , i, s, , a, , t, e, s, t, , _, )
我认为您的目标是什么?
作为一个脚注,我假设这只是一种练习,但值得注意的是,对这种操作使用左折操作效率极低,因为您是通过追加来建立列表的。