Scala:理解如何使我的方法返回正确的数组返回类型



我已经编写了以下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

我想完成的两件事是:

  1. 如何修复此方法?(或者它是一个函数)我的希望是,在我了解修复这个方法(或函数)需要什么之后,我将能够返回适当的类型。此外,我应该能够更好地理解方法和函数之间的区别

到目前为止,我对stackoverflow和Martin Odersky的书的研究似乎表明,我所写的是一个方法,因为它是在底层类的实例上调用的。我的理解对吗?

  1. 在它被修复后,我如何才能以一种更具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 parametersvals(通常编译为JVM方法),可能还有一些更多的细节。

相关内容

  • 没有找到相关文章

最新更新