2011-04-21 12 views
5

Do tej pory nie używałem zbyt wiele cech Scali i chcę to zmienić. Mam ten kod:Dlaczego potrzebuję średników po tych importach?

import tools.nsc.io.Path 
import java.io.File 

trait ImageFileAcceptor extends FileAcceptor { 
    override def accept(f:File) = { 
     super.accept(f) match { 
      case true => { 
       // additional work to see if it's really an image 
      } 
      case _ => false 
     } 
    } 
} 

Problemem jest to, kiedy mogę skompilować z sbt, trzymam przyjmującej:

ImageFileAcceptor.scala:2: ';' expected but 'import' found.

Jeśli dodać ; po imporcie, kod kompiluje. Oto FileAcceptor:

import java.io.File 

trait FileAcceptor extends Acceptable { 
    override def accept(f:File):Boolean = f.isFile 
} 

A oto Acceptable:

import java.io.File 

trait Acceptable { 
    def accept(f:File):Boolean 
} 

Nie rozumiem dlaczego muszę średników po przywozie.

EDIT: może wyjście SBT jest pomocne:

[info] Building project tt 1.0 against Scala 2.8.1 
[info] using sbt.DefaultProject with sbt 0.7.5 and Scala 2.7.7 
+0

Kiedy dodaję "true" po "// dodatkowej pracy, aby sprawdzić, czy to naprawdę obraz", kompiluje się dobrze z fsc pod Scala 2.9.0 RC1. –

+0

Na moim komputerze mam tam prawdę. Chciałem tylko skrócić ten fragment. – Geo

+10

Może to być problem kończący linię - czy może przypadkowo zapisałeś plik ze starymi zakończeniami linii Macintosh (\ r)? To faktycznie powoduje dokładnie ten błąd, który widzisz. – Moritz

Odpowiedz

4

Gdy kompilator Scala napotka linię kończącą Macintosh - będąc \r --the kompilator Scala będzie błędnie deklarują potrzebę średnikiem, jak Moritz tak wydedukował. Sekcja 1.2 z Scala Reference Manual opisuje prawidłowe znaki nowej linii. Nie mogłem znaleźć w Reference, które literały znaków zostały uznane za newlines. Z doświadczenia można uznać zarówno Windows (\r\n), jak i Unix (\n). Przypuszczalnie scala jest ściśle zgodna z Javą w tym zakresie.