2010-09-01 11 views
5

Ben bu örnek programda olduğu gibi, metot çağrımı gelen noktaları atlamak için deneyin:Scala'da "yineleme yöntemi <method name> türü" türü ne anlama geliyor?

object Test extends Application { 
    val baz = new Baz 
    var foo = baz bar 
    println(foo) 
} 

class Baz { 
    def bar = "bar" 
} 

garip hatalar olsun. Birincisi error: recursive method foo needs type: println foo ve diğeri error: type mismatch; found: Unit, required: Int, println(foo). foo türünün String olması gerektiğini belirtirseniz ilk hata bazı garip bir şekilde düzeltilmiştir. İkincisi, baz ve bar arasında bir nokta koymadan önce gitmeyecek. Bunun nedeni nedir? Scala neden baz bar'un özyinelemeli bir yöntem olduğunu düşünüyor?

+0

Benzer: http://stackoverflow.com/questions/2246212/why-does-scalas-semicolon-inference-fail-here – missingfaktor

cevap

7

Gördüğünüz sorun, noktaları çıkarırsanız kodun belirsiz olduğudur. derleyici

var foo = baz.bar(println(foo)) 

olarak ifade tedavi edecek, böylece foo yinelemeli olarak tanımlanır ve StringOps.apply yöntem Int argüman (String dolaylı String olarak StringOps dönüştürülür bir apply yöntem vardır) ihtiyacı vardır. Böyle belirsizliklerden kaçınmak için tek olmayan Unit argüman alır yöntemleri çağrılırken

Yalnızca sözdizimi gibi operatörünü kullanmalıdır.

+0

Cevabınız için çok teşekkür ederim. Scala'nın çizgileri bir araya getirmeye çalıştığı konusunda hiçbir fikrim yoktu. Noktalı virgül olarak satır sonlarını tedavi ettiğini düşündüm. Biraz denedim ve problem, "val foo = baz bar" dan sonra bir noktalı virgül yerleştirilerek de çözülebilir. – mranders

+0

Scala, normal olarak satır sonlarını beyaz boşluk olarak kabul eder ancak derleyici, gerektiğinde noktalı virgül çıkarımı yapmaya çalışır. Sizin durumunuzda bu tür çıkarsama ile birlikte sadece iyi çalışmıyor. – Moritz