2013-04-30 19 views
6

Ben bir Scala acemi değilim. Birkaç kitapla gezindim ve bazı çevrimiçi dersleri okudum. İlk projem sorun yaşıyor, bu yüzden kodu yanlış gidebilecek en basit şeye indirdim.Oluşturucular in varargs ile scala

Scala/constructors/varargs için google ve stack overflow'u aradım ve birkaç tur scala turunu okudum.

(hemen hemen) basit kodudur:

class Foo(val params: Int*) 
case class Foo1(val p: Int) extends Foo(p) 
case class Foo2(val p1: Int, val p2: Int) extends Foo(p1, p2) 

object Demo extends App { 
    override def main(args: Array[String]) { 
    val f = Foo2(1, 2) 
    f.p1 
    } 
} 

durum erişim p1 meydana gelir ve iplik

"ana" java.lang.ClassCastException olup: scala.collection.mutable.WrappedArray $ ofInt java.lang.Integer

tutulma kullanarak hata ayıklama başvurmak

için döküm olamaz, ben ilginç bir özellik bulundu: değişkenler bakarken

f Foo2 (id=23) 
    p2 2 
    params WrappedArray$ofInt (id=33) 
     array (id=81)  
      [0] 1 
      [1] 2 

Peki p1'e ne oldu?

Bir acemi soruyla Canını sıkan için üzgünüm

cevap

6

cevap gerektiğini düşünüyorum. Bu p üzerinden p1 geçmeye çalışır (sizin durumunuzda o Foo.params takım Foo2.p1 almaya çalışacaktı): işe olamaz çünkü bir hata besbelli

def p1(): Int = scala.Int.unbox(Main$$anon$1$B.super.p()); 

. Bunun yerine, alt sınıfın oluşturucusuna p1'u atamalıdır.

Bir hata bildirdi: SI-7436.

+0

Woot'u derler ve çalıştırır. İlk Scala hatam. Tamam teşekkürler. Etrafta bir işim var ama yardımın için minnettarım. Bu bana Fortran denklik bloklarını veya Pascal değişken kayıtlarını hatırlattı. –

+0

Btw, 'sınıf X (val p: Int *)' çok anlamlı değil. Eğer X inşasından sonra 'p' ye erişmek istiyorsanız sadece varargs yerine bir sıra kullanın: 'class X (val p: Seq [Int])' veya 'class X (p: Int *) {def params: Seq [Int] = p}. – sschaef

1

Sana açıklayamam/neden Scala karışır, ancak aşağıdaki işleri /: Ayrıca

class Foo(p: Int, ps: Int*) 
case class Foo1(p1: Int) extends Foo(p1) 
case class Foo2(p1: Int, p2: Int) extends Foo(p1, p2) 

object Main extends App { 
    println(Foo1(1)) 
    println(Foo2(2, 3)) 
} 

not ki App uzanan zaman main'u geçersiz kılmak istemezsiniz.

+0

Uygulama hakkındaki yorumu takdir ediyorum. Ben bir acemi, bu yüzden Eclipse'deki Hello World örneğini kullandım. Çalışma kodu için teşekkürler. Ben de işe yarayan listeler kullanarak bir şey var: benim sorun anlayış biridir. Ne yazık ki, kodun "okunabilirliği" hakkında çok rahatsızım ve değişken paramların niyeti tüm paramları tutmaktır. Bu bir scala hatası olup olmadığını merak ediyorum –

+0

Yorumunuzu okuyarak Yukarıdaki kodun örneğin anlamını değiştirdiğinden de bahsetmeliydim, çünkü Foo'nun yapıcısı artık en az bir argüman gerektiriyor. Muhtemelen biggy yok ama bu sorun alan adına bağlı :) – fotNelton

0

Sen this comment bir göz ve onun hemen üstünde cevap vermesi gerekiyor, ben Yanılmadın ama derleyici bu sizin sorunu ;-)

+0

Yanıt için teşekkürler. Bunu sormadan önce gördüm, ama doğru cevap olduğunu düşünmüyorum. Bu soruda, kişi yapıcıya Any * paramlarını iletmek istedi. Bunu yapmak istemiyorum. Foo2 durumunda (p1, p2) Any * 'a geçiyorum ve bazı garip nedenlerden dolayı, değişken p1'e erişimi kaybediyor ve param olmak için bir çağrı ile değiştiriyor, sonra bir sınıf kadrosuna sahip oluyor. Soruda, kişinin derleme kodunu alamadığını unutmayın. Mine, –

İlgili konular