我有以下代码:
def findNonEqualTuples(value: String): List[(Char, Char)] = {
val result = ListBuffer((Char,Char))
for (current <- 0 until value.length / 2) {
if (!value.charAt(current).equals(value.charAt(value.length - 1 - current))) {
val tuple = (value.charAt(current), value.charAt(value.length - 1 - current))
result += tuple
}
}
return result.toList
}
行result += tuple
表示“类型不匹配,预期:(Char.type,Char.type)actual :( Char,Char)”。我对scala很新。有人可以解释这两种类型之间有什么区别以及我如何修复它?
答案 0 :(得分:2)
您的问题在于如何声明result
ListBuffer
。尝试:
val result = ListBuffer[(Char,Char)]()
方括号表示法用于指定参数类型。编译器对您的代码的解释是您要创建一个新的ListBuffer
初始化为包含元组(Char, Char)
,即包含Char
类型的元组(更准确地说,正如@LuigiPlinge所指出的,它是Char
伴侣对象 - 与自身配对) - 因此不匹配错误。
编辑 - 解决评论中的问题:
这是一个不同类型的大括号问题:)
关键是要记住,即使Scala中的运算符实际上是方法调用,
所以result += (...)
实际上是糖:
result = result.+(...) // since "op=" is sugar for x = x op ...
即。使用括号中包含的参数调用+=
方法。因此,要传递由元组组成的单个参数,我们需要一组额外的括号:
result += ((value.charAt(current), value.charAt(value.length - 1 - current)))
外部括号分隔方法的参数列表,而内部括号封装元组。