【发布时间】:2015-01-10 07:14:11
【问题描述】:
我有一个测试程序,其中我们有内存中的静态数组。为简洁起见,我使用类型别名。
REPL 中的以下工作
type >[T] = Array[T]
val dat = >(>(1,2,3),>(2,3,4))
dat: Array[Array[Int]] = Array(Array(1, 2, 3), Array(2, 3, 4))
但是,将标识符从“>”更改为“A”确实不起作用:类型已创建,但用于创建上述数组的相同语法失败:
scala> type A[T] = Array[T]
defined type alias A
scala> val dat = A(A(1,2,3),A(2,3,4))
<console>:7: error: not found: value A
val dat = A(A(1,2,3),A(2,3,4))
此外,以上两个都不能在 Scala 程序 AFAICT 中工作:
test("VectorProjection") {
type A[T] = Array[T]
// Next line shows RED for all the A's and also has compiler error: "not found: value A"
val dat = A(A(1., 2., 3.), A(1.5,2.,2.5), A(2.,3.8,5.6), A(2.5,3.0,3.5), A(3.1,3.7,4.3) )
val firsteigen = subtractProject(dat(0), dat(4))
}
正在寻找:
- 1) 对于 REPL:解释为什么符号“>”有效但无效 标识符会很有帮助。
- 2) 对于真正的 Scala 程序/类: 解释是否可以使用任何类似的语法 以上
更新根据 James Iry 的建议,以下方法确实有效:
def A[T : ClassTag](ts: T*) = Array(ts:_*)
它在行动:
test("VectorProjection") {
def A[T : ClassTag](ts: T*) = Array(ts:_*)
val dat = A(
A(1., 2., 3.),
A(1.5,2.,2.5),
A(3.,6.,9.) )
val firstEigen = subtractProject(dat(0), dat(5))
println(s"firstEigen: ${firstEigen.mkString(",")}")
}
另一个更新另一个答案更接近这个 OP:
同时使用 type 和 val:
type A = Array[Double]
val A = Array
它在行动:
test("VectorProjection") {
type A = Array[Double]
val A = Array
val dat = A(
A(1., 2., 3.),
A(1.5,2.,2.5),
A(3.,6.,9.) )
val firstEigen = subtractProject(dat(0), dat(5))
println(s"firstEigen: ${firstEigen.mkString(",")}")
}
【问题讨论】:
-
你使用的是什么版本的scala?您的第一个示例对我不起作用(scala 2.11.2)(并且 afaik 不/不应该适用于任何版本)。至于为什么,见this answer。
-
@Marth scala 2.10.4
-
每个人都想知道你是如何破坏你的 repl 会话的。
-
我的意思是,你的 REPL 进入了我们无法复制的状态。诊断一下就好了。 REPL 历史状态很多,会产生欺骗性的结果;注释您的代码
// show以显示您的代码编译成的内容,包括从历史记录中导入。顺便说一句,Iry 的回答是正确的;你不是说你的第一个例子有效,对吧?