Scala:了解如何使我的方法返回正确的返回类型的Array

时间:2015-04-26 17:35:22

标签: scala

我编写了以下Scala代码:

server:
  rootPath: /api/*

这就是我想要完成的事情:

我将创建一个类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的参数。然后我想这个方法给我一个`Array [Int]。

然而,就目前而言,Scala IDE正在抱怨这一行:

String
  

类型不匹配;找到:所需单位:Int

我想要完成的两件事是:

  1. 我该如何修复此方法? (或者它是一个功能) 我的希望是,在我理解修复此方法(或函数)所需的内容后,我将能够返回相应的类型。此外,我应该更好地理解方法和函数之间的区别。
  2. 到目前为止,我对stackoverflow和Martin Odersky的书的研究似乎向我建议我写的是一个方法,因为它是在底层类的实例上调用的。我的理解是正确的吗?

    1. 修复之后,如何通过摆脱var来以更加Scalaesque的方式重写它。代码现在看起来更像C或java,在我看来有点长,毕竟我到目前为止研究过Scala。
    2. 感谢您帮助重构上述代码以实现我的学习目标。

2 个答案:

答案 0 :(得分:2)

您正在使用赋值语句调用cpArray.update,该语句在期望Unit时评估为Integer。您需要使用Integer

来调用它
j += 1
cpArray(j) = inputStr.codePointAt(i)

答案 1 :(得分:2)

一个问题很多。我试着全部回答。

首先,正如Jörg所指出的那样,移动赋值会使代码工作。与Java和C相反,Scala的赋值不会返回指定的值,而是echo '<td><input type="text" name="datepicker" class="datepicker"></td>'; echo '</tr>';

现在让它成为惯用语。 Scala的Unit可以看作String,这意味着您通常可以将它们视为IndexedSeq[Char]。所以你做了类似的事情:

IndexedSeqs

这将返回一个Array [Int]。请注意,它仅适用于16位inputStr.map{ x => x.toInt }.toArray 表示。希望它有助于提出惯用的Scala,甚至不是一个完美的解决方案。

对于方法和函数之间的区别,它很简单:方法通常在类中char。在JVM意义上,另一只手的函数是defs。例如,上面的Objects可以定义为:

map

两者都是相同的def map(f: Function1[Char, Int]):IndexedSeq[Int] // or def map(f: Char => Int):IndexedSeq[Int] desugars到=>之一(N从0到22,包括在内)。

并且scala.FunctionN以类似的方式被移植到x => x.toInt的实例中。看到它是Scaladoc

因此,函数是scala.Function1类型的对象。

注意:为了简单起见,我省略了一些细节,例如scala.FunctionNtype parameters s(通常编译为JVM方法),可能还有一些细节。