2010-09-08 4 views
4

Какие конструкторы нуждаются в компиляции «scalac» и как сделать эквивалент, который будет работать в интерпретаторе?Каковы ограничения и интервалы между интерпретатором Scala?

Редактировать: Я хочу использовать scala вместо python в качестве языка сценариев. (с #!/usr/bin/scala)

+0

Я просто задавался вопросом, подходит ли оно. Но компиляция scala слишком медленная. –

ответ

0

Я думаю, что все в Scala будет работать и от интерпретатора (что, я считаю, просто вызывает компилятор под капотом).

Вы подозреваете, что что-то не работает? Или это вопрос об уловке/интервью (я полагаю, что все, что хочет напрямую взаимодействовать с загрузчиком классов или файлами классов, может вести себя по-разному в двух средах, но я понятия не имею).

3

EDIT: после прочтения вашего вопроса снова, я должен признать, что я действительно не отвечал на него;). Но, возможно, это все еще помогает.

Я знаю о двух ограничениях интерпретатора (или REPL), когда дело доходит до загрузки файлов scala (для их интерактивного тестирования).

  • Вы не можете загружать файлы scala с определениями пакетов в них. REPL жалуется и не загружает весь класс - файл scala для загрузки. Он читал, что это связано с тем, что файлы, загруженные в REPL, рассматриваются как объект. , , которые, конечно же, не могут иметь в них никаких определений пакетов.
  • REPL странный (или немного непредсказуемый), когда есть файлы классов загруженных файлов scala в пути к классам. Отъезд this question by myself и особенно мои 2 последних комментария ко второму ответу.

Кроме того, существует проблема с циклическими зависимостями, что я не знаю, обходной путь для: Предположим, что существует класс A, который использует класс B который снова нуждается в A сделать его работу. Конечно, вы не можете определить A, так как нет определения B и наоборот. Предоставление соски для одного из тех, кто не работает, либо:

scala> class A {           
| def alterString(s:String) = s      
| def printStuff(s:String) = println(alterString(s)) 
| }             
defined class A 

scala> class B {           
| val prefix = "this is a test: "     
| def doJob() = new A() printStuff "1 2 3"    
| } 
defined class B 

scala> class A { 
| def alterString(s:String) = new B().prefix + s 
| def printStuff(s:String) = println(alterString(s)) 
| } 
defined class A 

scala> new B().doJob() 
1 2 3 

scala> 

Хотя я уже представил новое определение A, класс B до сих пор используется тот, который присутствовал, когда я определил его.

6

Вы должны быть в состоянии сделать что-либо в REPL, что вы можете сделать во внешнем коде. Имейте в виду, что:

  • Вещи, которые обращаются друг к другу, должны быть внутри одного блока. Таким образом, не может быть введено как-есть; вы должны обернуть его в какой-то другой объект:

    class C(i : Int) { def succ = C(i+1) }
    object C { def apply(i: Int) = new C(i) }

  • Среда выполнения несколько отличается, поэтому бенчмаркинг тайминги не всегда выходят точно так же, как если бы вы запускать их из скомпилированного кода.

  • Вы вводите путь выполнения другим способом; если вы хотите вызвать метод main, вы, конечно, можете изнутри REPL.

  • Вы не можете просто вырезать и вставить всю библиотеку в REPL и заставить ее работать точно так же, как библиотека; REPL имеет другую структуру, чем обычные пакеты. Поэтому оставьте объявления «package» во время тестирования.

+0

Что касается вашей заметки о прямых ссылках, вы также должны обернуть компаньонов в объекте: http://stackoverflow.com/questions/3551981/is-it-possible-to-define-companion-classes-modules-in-the -scala-переводчик –

 Смежные вопросы

  • Нет связанных вопросов^_^