2014-01-10 2 views
0

Я знаю, что программисты должны обернуть свой код в объекте приложения:Имеет ли Scala глобальный объект или класс?

object Hello extends App { 
    println("Hello, World") 
} 

Требуется в Eclipse, если я когда-нибудь хочу, чтобы получить какой-либо вывод. Однако, когда я попытался написать код (очень небрежно) в Emacs, я пишу так:

class Pair[+T](val first: T, val second: T) 

trait Friend[-T] { 
    def befriend(someone: T) 
} 

def makeFriendWith(s: Student, f: Friend[Student]) { 
    f.befriend(s) 
} 

Похоже, что нет универсального объекта или класса, который оборачивает над функцией makeFriendWith. Является ли Scala как JavaScript, все привязано к глобальному объекту? Если нет, к чему эта функция прикреплена?

Кроме того, почему это может работать в консоли (я выполнял команду scala и работал), но не работает в Eclipse? Какая польза от объекта Application?

ответ

1

Как язык JVM, Scala не может по-настоящему создавать объекты верхнего уровня, отличные от классов и интерфейсов.

Это, однако, есть понятие «объект» пакета, который создает иллюзию стоимости entites (val, var и def) не заключенная в классе или признака.

Для получения информации о объектах упаковки см. http://www.scala-lang.org/docu/files/packageobjects/packageobjects.html.

+0

Есть ли дополнительная информация об этом объекте пакета? –

+2

Это ответ на вопросы? Я не думал, но, возможно, это только я. –

+0

Я добавил ссылку на документацию объекта пакета. Я считаю их довольно незначительной особенностью языка и редко использую их. –

2

Вы можете определить такие методы как только в консоли, которая (за кулисами) автоматически обертывает их в анонимный класс для вас.

За пределами консоли нет такой роскоши.

5

У Scala нет defs верхнего уровня, но ваш скрипт может запускаться либо REPL, либо scala script runner.

Точное поведение вашего скрипта зависит от того, каким образом вы его запускаете.

REPL может запускать сценарии по очереди или целиком. (Сравните :paste и :paste -raw против :load или -i init.script и будущей опции -I init.script.)

Существует issue about sensitive scripting. Бегун сценария должен понять, если вы пытаетесь запустить App.

Существует another effort, чтобы создать сценарий компилятора, который легко настраивается. Прокрутите до Scripter.scala для комментариев кода о его текущей эвристике.

Короче говоря, ваши defs должны быть завернуты в объект верхнего уровня, но точно, как это происходит, зависит от контекста.

Было сделано a recent effort, чтобы сделать альтернативную схему обертывания, доступную для REPL.

Ничего из этого не предусмотрено спецификацией языка, а не только специальные правила, относящиеся к файлам сборки sbt.

0

Вы можете запустить код как это прямо в Eclipse: используйте Scala worksheet. Плагин IntelliJ IDEA Scala поддерживает его также.

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