2012-04-04 19 views
5

Sorunu çözmeye çalışıyorum ve Scala'da okuduğum farklı stilleri denedim, ancak bunların hiçbiri çalışmıyor. Benim kodudur:Scala işlevim neden son bir satır olursa olsun, Birim türünü döndürüyor?

.... 

val str = "(and x y)"; 

def stringParse (exp: String, pos: Int, expreshHolder: ArrayBuffer[String], follow: Int) 

    var b = pos; //position of where in the expression String I am currently in 
    val temp = expreshHolder; //holder of expressions without parens 
    var arrayCounter = follow; //just counts to make sure an empty spot in the array is there to put in the strings 

    if(exp(b) == '(') { 
     b = b + 1; 

     while(exp(b) == ' '){b = b + 1} //point of this is to just skip any spaces between paren and start of expression type 

     if(exp(b) == 'a') { 
       temp(arrayCounter) = exp(b).toString; 
       b = b+1; 
       temp(arrayCounter)+exp(b).toString; b = b+1; 
       temp(arrayCounter) + exp(b).toString; arrayCounter+=1} 
       temp; 

     } 

} 

val hold: ArrayBuffer[String] = stringParse(str, 0, new ArrayBuffer[String], 0); 
for(test <- hold) println(test); 

Benim hatadır:

Driver.scala:35: error: type mismatch; 
found : Unit 
required: scala.collection.mutable.ArrayBuffer[String] 
ho = stringParse(str, 0, ho, 0); 
       ^one error found 

Bir, yöntem bildiriminde argümanlar sonra eşittir işareti şöyle eklediğinizde: Bu dönüştürürler

def stringParse (exp: String, pos: Int, expreshHolder: ArrayBuffer[String], follow: Int) ={....} 

"Herhangi biri". Bunun nasıl çalıştığına dair kafam karıştı. Herhangi bir fikir? Çok takdir edildi.

+1

+1 bir şey için newb her zaman karşı karşıya gelecek. Açıklama aynı zamanda küçük bir karşı-intikamdır. – aitchnyu

cevap

8

Bir değer döndürmek istiyorsanız, eşittir işaretini eklemeniz gerekir. Şimdi, fonksiyonunuzun geri dönüş değerinin nedeni ise, her biri farklı türde bir değer döndüren 2 kontrol yoluna sahip olmanızdır - 1, eğer koşulun yerine getirildiği zaman (ve geri dönüş değeri temp olacaktır) diğeri ise koşul değilse (ve dönüş değeri b = b + 1 veya artırıldıktan sonra b).

+0

Eğer if değilse, dönüş değeri neden b = b + 1 olur? Ama ne demek istediğini anlıyorum. Java'da öyle değildir, bu yüzden scala'nın diğer davaları içerdiğini düşünmek tuhaf. – Andy

+0

Neden b = b + 1. Bu mantıklı. Burada farklı bir şekilde biçimlendirdim, bu yüzden editörümde ona baktığımda anlamlı geldi. Beni doğru yöne işaret ettiğin için teşekkürler! – Andy

+0

İlk olarak, if koşulunun karşılanmadığı durumda, işlevden hangi değeri döndürmesini istediğinize karar vermelisiniz. Öyleyse, bu değeri kullanmadan önce "kullan" seçeneğini kullanabilir veya başka bir madde ekleyebilir ve buraya koyabilirsiniz. –

9

İşte böyle sorunlar yaklaşabilir nasıl daha genel bir cevap var:

O kafanın bir işlev ve yazma bazen olur bu tip X verir varsayalım, ama bir yerde yolda derleyici katılmıyor. Bu hemen hemen her zaman fonksiyonun yazıldığı zaman gerçekleşir, bu yüzden derleyici size asıl kaynağı vermezse (bunun yerine işlevin çağrıldığı satırı gösterir) normalde fonksiyonunuzun dönüş türünün problem olduğunu bilirsiniz.

Sorununuzu hemen göremiyorsanız, işlevinizi açıkça yazmak için basit bir numara vardır. Örneğin, işlevinizin Int döndüğünü düşünürseniz, ancak bir şekilde derleyici bir Unit bulduğunu söylüyorsa, bu işleve : Int eklemenize yardımcı olur. Bu şekilde, derleyicinin size yardımcı olacağı konusunda yardımcı olacaksınız, çünkü işlevinizdeki bir yol, ilk olarak aradığınız asıl sorun olan Int değerini döndürür.

+0

Teşekkürler. Evet, bunu denedim, ama yine de bana hata verdi. Bunun bir sorun olabileceğini düşündüm, ama en azından benim problemim için çözmedi. Kesinlikle yardımcı olabilecek diğer durumlar açısından. Ben dil için yeni ve girdiyi takdir ediyorum. – Andy

0
class Test(condition: Boolean) { 

    def mixed = condition match { 
    case true => "Hi" 
    case false => 100 
    } 

    def same = condition match { 
    case true => List(1,2,3) 
    case false => List(4,5,6) 
    } 

    case class Foo(x: Int) 
    case class Bar(x: Int) 

    def parent = condition match { 
    case true => Foo(1) 
    case false => Bar(1) 
    } 
} 
val test = new Test(true) 

test.mixed // type: Any 
test.same // type List[Int] 
test.parent // type is Product, the case class super type 

derleyici (/ else if, katlama, vb maç) koşullu dönen sonucun türlerinin olası kümesi temelinde en belirgin türü uygulamak için elinden geleni yapacaktır.

İlgili konular