2015-01-09 53 views
1

我有一個測試程序,我們在內存中的靜態數組。爲了簡潔,我使用類型別名。類型被創建,但如上述用於創建陣列相同的語法:類型別名工作在REPL但不在斯卡拉類/對象

在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)) 

另外,NEITHER的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程序/類: 的如果有可能由詹姆斯IRY使用類似於任何語法 上述

UPDATE每建議以下方法確實可行的解釋:

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:

使用類型和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(",")}") 
    } 
+0

你使用的是什麼版本的scala?你的第一個例子不適合我(斯卡拉2.11.2)(和afaik不/不應該適用於任何版本)。至於爲什麼,請參閱[這個答案](http://stackoverflow.com/a/15784052/2650437)。 – Marth 2015-01-09 22:42:47

+0

@Marth scala 2.10.4 – javadba 2015-01-09 23:03:52

+0

每個人都想知道你是如何執行你的repl會話的。 – 2015-01-09 23:06:02

回答

2

如果你創建一個值別名它會工作:

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類型別名創建值。它將依次能夠調用A.apply(1,2,3)。

+0

我選擇這個答案作爲正確的答案,因爲它最直接地響應OP。 – javadba 2015-01-09 23:05:10

3

我不能複製'>'成功'

scala> type >[T]=Array[T] 
defined type alias $greater 

scala> >(1,2,3) 
<console>:8: error: not found: value > 
       >(1,2,3) 
      ^

至少,直到我把它定義

scala> import scala.reflect._ 
import scala.reflect._ 

scala> def >[T : ClassTag](ts: T*) = Array(ts:_*) 
$greater: [T](ts: T*)(implicit evidence$1: scala.reflect.ClassTag[T])Array[T] 

scala> >(1,2,3) 
res1: Array[Int] = Array(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) 

有關說明:類型X = Y剛剛創建的類型X.它不會在同義詞帶來的代名詞其他一切可能與像同伴對象,構造方法的類型相關聯,等等

+0

有趣的是你無法重現REPL的成功。我把你的代碼(不是分配給一個變量),它也工作。但是對於這裏的主要事件:我喜歡你的def,並且會在真正的節目中嘗試它。 – javadba 2015-01-09 23:00:25

+0

我原本授予這個答案,但另一個來了片刻之後,更準確地回答OP。這個問題在任何情況下都是有用的,我相應地提高了。 – javadba 2015-01-09 23:05:51

1

使用此證明有多少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 

但它不走樣警告。

+0

謝謝,這是有用的信息。 – javadba 2015-01-09 23:06:19