键入在REPL中工作但不在scala类/对象中工作的别名
我有一个测试程序,里面有内存中的静态数组。为了简洁起见,我使用了类型别名 以下内容适用于REPL键入在REPL中工作但不在scala类/对象中工作的别名,scala,types,Scala,Types,我有一个测试程序,里面有内存中的静态数组。为了简洁起见,我使用了类型别名 以下内容适用于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] = Arra
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))
寻找:
- 1) 对于REPL:解释为什么符号“>”起作用但不起作用 标识符会很有帮助李>
- 2) 对于真正的scala程序/类: 解释是否可以使用类似的语法 以上
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(",")}")
}
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(",")}")
}
另一个更新另一个答案更接近此操作:
同时使用type和val:
type A = Array[Double]
val A = Array
这就是它的作用:
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(",")}")
}
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> type >[T]=Array[T]
defined type alias $greater
scala> >(1,2,3)
<console>:8: error: not found: value >
>(1,2,3)
^
同样的事情也适用于家庭
scala> type A[T]=Array[T]
defined type alias A
scala> A(1,2,3)
<console>:11: error: not found: value A
A(1,2,3)
^
scala> def A[T : ClassTag](ts: T*) = Array(ts:_*)
A: [T](ts: T*)(implicit evidence$1: scala.reflect.ClassTag[T])Array[T]
scala> A(1,2,3)
res2: Array[Int] = Array(1, 2, 3)
scala>类型A[T]=数组[T]
定义的类型别名A
scala>A(1,2,3)
:11:错误:未找到:值A
A(1,2,3)
^
scala>defa[T:ClassTag](ts:T*)=Array(ts:*)
A:[T](ts:T*)(隐式证据$1:scala.reflect.ClassTag[T])数组[T]
scala>A(1,2,3)
res2:Array[Int]=数组(1,2,3)
解释一下:类型X=Y只是为类型X创建了一个同义词。它不会为可能与该类型相关的所有其他对象(如伴生对象、构造函数方法等)引入同义词。我无法用'>'复制您的成功
scala> type >[T]=Array[T]
defined type alias $greater
scala> >(1,2,3)
<console>:8: error: not found: value >
>(1,2,3)
^
同样的事情也适用于家庭
scala> type A[T]=Array[T]
defined type alias A
scala> A(1,2,3)
<console>:11: error: not found: value A
A(1,2,3)
^
scala> def A[T : ClassTag](ts: T*) = Array(ts:_*)
A: [T](ts: T*)(implicit evidence$1: scala.reflect.ClassTag[T])Array[T]
scala> A(1,2,3)
res2: Array[Int] = Array(1, 2, 3)
scala>类型A[T]=数组[T]
定义的类型别名A
scala>A(1,2,3)
:11:错误:未找到:值A
A(1,2,3)
^
scala>defa[T:ClassTag](ts:T*)=Array(ts:*)
A:[T](ts:T*)(隐式证据$1:scala.reflect.ClassTag[T])数组[T]
scala>A(1,2,3)
res2:Array[Int]=数组(1,2,3)
解释如下:类型X=Y只是为类型X创建了一个同义词。它不会为可能与该类型相关的所有其他对象(如伴生对象、构造函数方法等)引入同义词。如果创建值别名,它将起作用:
type A[T] = Array[T]
val A = Array
val dat = A(A(1,2,3),A(2,3,4)) //dat: Array[Array[Int]] = Array(Array(1, 2, 3), Array(2, 3, 4))
第2行创建了一个值别名,因此您可以使用
类型别名创建值。反过来,它将能够调用A.apply(1,2,3)。如果您创建一个值别名,它将工作:
type A[T] = Array[T]
val A = Array
val dat = A(A(1,2,3),A(2,3,4)) //dat: Array[Array[Int]] = Array(Array(1, 2, 3), Array(2, 3, 4))
第2行创建了一个值别名,因此您可以使用类型别名创建值。反过来,它将能够调用A.apply(1,2,3)。使用它来显示repl知道的内容:
scala> $intp.definedTerms
res0: List[$intp.global.TermName] = List($intp)
scala> $intp.definedTypes
res1: List[$intp.global.TypeName] = List($greater)
例如,您可能有:
scala> object X
defined object X
scala> trait X
defined trait X
warning: previously defined object X is not a companion to trait X.
Companions must be defined together; you may wish to use :paste mode for this.
scala> type X = String
defined type alias X
但它不会对别名发出警告。使用此选项显示repl知道的内容:
scala> $intp.definedTerms
res0: List[$intp.global.TermName] = List($intp)
scala> $intp.definedTypes
res1: List[$intp.global.TypeName] = List($greater)
例如,您可能有:
scala> object X
defined object X
scala> trait X
defined trait X
warning: previously defined object X is not a companion to trait X.
Companions must be defined together; you may wish to use :paste mode for this.
scala> type X = String
defined type alias X
但它不会对别名发出警告。您使用的是什么版本的scala?您的第一个示例不适用于我(scala 2.11.2)(而afaik不/不应该适用于任何版本)。至于原因,请参见。@Marth scala 2.10.4每个人都想知道您是如何中断repl会话的。我所说的中断是指,您的repl处于无法复制的状态。如果能诊断出来就好了。REPL历史是一个很大的状态,它可以产生欺骗性的结果;注释代码//show
以显示代码编译的目的,包括从历史记录中导入的内容。顺便说一句,艾瑞的答案是正确的;你并不是说你的第一个例子有效,对吧?你使用的是什么版本的scala?您的第一个示例不适用于我(scala 2.11.2)(而afaik不/不应该适用于任何版本)。至于原因,请参见。@Marth scala 2.10.4每个人都想知道您是如何中断repl会话的。我所说的中断是指,您的repl处于无法复制的状态。如果能诊断出来就好了。REPL历史是一个很大的状态,它可以产生欺骗性的结果;注释代码//show
以显示代码编译的目的,包括从历史记录中导入的内容。顺便说一句,艾瑞的答案是正确的;您并不是说您的第一个示例有效,对吧?有趣的是,您无法复制REPL成功。我接受了您的代码(没有明确地分配给变量),它也起了作用。但对于这里的主要事件:我喜欢你的def,并将在一个真正的程序中尝试它。我最初给出了这个答案,但不久后又给出了另一个答案,这是对OP的更精确的答案。这个问题在任何情况下都是有帮助的,我相应地提高了投票率。有趣的是,你无法重现REPL的成功。我接受了您的代码(没有明确地分配给变量),它也起了作用。但对于这里的主要事件:我喜欢你的def,并将在一个真正的程序中尝试它。我最初给出了这个答案,但不久后又给出了另一个答案,这是对OP的更精确的答案。这个问题在任何情况下都是有帮助的,我相应地提高了投票率。我选择这个答案是正确的,因为它最直接地响应OP。我选择了这个答案是正确的,因为它是对OP最直接的回应。谢谢这是有用的信息。谢谢这是有用的信息。