我编写了以下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
我想要完成的两件事是:
到目前为止,我对stackoverflow和Martin Odersky的书的研究似乎向我建议我写的是一个方法,因为它是在底层类的实例上调用的。我的理解是正确的吗?
感谢您帮助重构上述代码以实现我的学习目标。
答案 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.FunctionN
,type parameters
s(通常编译为JVM方法),可能还有一些细节。