我已经编写了以下Scala代码:
class MyTestApi {
private def toCPArray(inputStr: String): Array[Int] = {
val len = inputStr.length
//invoke ofDim of Scala.Array
val cpArray = Array.ofDim[Int](inputStr.codePointCount(0, len))
var i = 0
var j = 0
while (i < len) {
cpArray(j += 1) = inputStr.codePointAt(i)
i = inputStr.offsetByCodePoints(i, 1)
}
cpArray
}
}
这就是我想要完成的:
我将创建类MyTestApi
的一个实例,然后调用方法toCPArray
并向其传递类型为String
的参数。然后我希望这个方法返回一个`Array[Int]。
然而,就目前而言,Scala IDE正在抱怨这句话:
**cpArray(j += 1) = inputStr.codePointAt(i)**
类型不匹配;找到:所需单位:Int
我想完成的两件事是:
- 如何修复此方法?(或者它是一个函数)我的希望是,在我了解修复这个方法(或函数)需要什么之后,我将能够返回适当的类型。此外,我应该能够更好地理解方法和函数之间的区别
到目前为止,我对stackoverflow和Martin Odersky的书的研究似乎表明,我所写的是一个方法,因为它是在底层类的实例上调用的。我的理解对吗?
- 在它被修复后,我如何才能以一种更具Scala风格的方式重写它,通过去掉var。代码现在看起来更像C或java,在我看来有点长,毕竟我已经研究了Scala
感谢您在重构上述代码以实现我的学习目标方面提供的任何帮助。
您使用赋值语句调用cpArray.update
,当它需要Integer
时,赋值语句的求值结果为Unit
。你需要用Integer
:来称呼它
j += 1
cpArray(j) = inputStr.codePointAt(i)
多个问题合一。我试着回答所有的问题。
首先,正如Jörg所指出的,移动赋值可以使代码正常工作。与Java和C相反,Scala的赋值不返回赋值,而是返回Unit
。
现在让它变得地道。Scala的String
可以看起来像IndexedSeq[Char]
,这意味着您通常可以将它们视为IndexedSeqs
。所以你做了一些类似的事情:
inputStr.map{ x => x.toInt }.toArray
这将返回一个数组[Int]。请注意,它只适用于16位char
表示。希望它能帮助我们了解Scala的惯用用法,即使它不是一个完美的解决方案。
对于方法和函数之间的区别,很简单:方法通常是类中的defs
。另一方面,函数是JVM意义上的Objects
。例如,上述map
可以定义为:
def map(f: Function1[Char, Int]):IndexedSeq[Int]
// or
def map(f: Char => Int):IndexedSeq[Int]
两者都是相同的,=>
去糖到scala.FunctionN
中的一个(N从0到22,包括0到22)。
并且CCD_ 18以类似的方式被去耦合到CCD_ 19的实例中。看它是Scaladoc。
因此,函数是scala.FunctionN
类型的对象。
注意:为了简单起见,我省略了一些细节,比如type parameters
、val
s(通常编译为JVM方法),可能还有一些更多的细节。