1

我正在尝试在 Scala 中编译简单的 helloworld,并得到错误“scala: value capitalize is not a member of Char” 为什么编译器认为 newW 是 Char?

val dict = Map(
    "hello" -> "olleh",
    "world" -> "dlrow"
  )

def translate(input: String): String = {
  input.split( """\s+""").map(w => dict.getOrElse(w.toLowerCase, w).map(newW => 
    (if (w(0).isUpper) newW.capitalize else newW))
  ).mkString(" ")
}
4

2 回答 2

3

这是正在发生的事情:

input // is a string
.split( """\s+""") // is an Array[String]
.map(w => // w is a String, for each String in the Array[String]
  dict.getOrElse(w.toLowerCase, w) // is a String (returned by dict.getOrElse)
  .map(newW => // is a Char, for each Char in the String returned by dict.getOrElse
于 2013-02-14T23:47:54.033 回答
3

map对in的第二个调用translate是跨从 的返回值进行映射dict.getOrElse(...),其类型为String,可以隐式处理为Iterable[Char]。因此,当您尝试调用它时,编译器会正确推断出它newW的类型并抱怨。你可能正在寻找类似的东西Charcapitalize

def translate(input: String): String = {
  input.split( """\s+""").map(w => {
    val newW = dict.getOrElse(w.toLowerCase, w)
    (if (w(0).isUpper) newW.capitalize else newW)
  }).mkString(" ")
}

更新:顺便说一句,如果input是一个空字符串,它将在运行时失败 - 它至少需要再次检查安全性。

于 2013-02-14T23:51:12.137 回答