Как запустить метод Scala из командной строки?

Этот вопрос может показаться немного глупым, но я не мог понять, как запустить метод Scala из командной строки.

Я скомпилировал следующий файл Test.scala:

package example

object Test {
  def print() {
    println("Hello World")
  }

}

с scalac Test.scala.

Затем я могу запустить метод print с помощью scala в два этапа:

C:\Users\John\Scala\Examples>scala
Welcome to Scala version 2.9.2 (Java HotSpot(TM) Client VM, Java 1.6.0_32).
Type in expressions to have them evaluated.
Type :help for more information.

scala> example.Test.print
Hello World

Но мне действительно нравится делать, чтобы запустить метод непосредственно из командной строки с помощью одной команды, например scala example.Test.print.

Как я могу достичь этой цели?

UPDATE: Предлагаемое решение от ArikG не работает для меня - Что мне не хватает?

C:\Users\John\Scala\Examples>scala -e 'example.Test.print'
C:\Users\John\AppData\Local\Temp\scalacmd1874056752498579477.scala:1: error: u
nclosed character literal
'example.Test.print'
         ^
one error found

C:\Users\John\Scala\Examples>scala -e "example.Test.print"
C:\Users\John\AppData\Local\Temp\scalacmd1889443681948722298.scala:1: error: o
bject Test in package example cannot be accessed in package example
example.Test.print
        ^
one error found

где

C:\Users\John\Scala\Examples>dir example
 Volume in drive C has no label.
 Volume Serial Number is 4C49-8C7F 

 Directory of C:\Users\John\Scala\Examples\example

14.08.2012  12:14    <DIR>          .
14.08.2012  12:14    <DIR>          ..
14.08.2012  12:14               493 Test$.class
14.08.2012  12:14               530 Test.class
               2 File(s)          1.023 bytes
               2 Dir(s)  107.935.760.384 bytes free

ОБНОВЛЕНИЕ 2 - Возможные РЕШЕНИЯ:

  • Как правильно предложил ArikG, при scala -e "import example.Test._; print" хорошо работает с Windows 7.
  • См. ответ Дэниела, чтобы заставить его работать без оператора импорта

Ответ 1

Позвольте мне немного расширить это решение:

scala -e 'example.Test.print'

Вместо этого попробуйте:

scala -cp path-to-the-target-directory -e 'example.Test.print'

Где целевой каталог - это каталог, в котором scala используется как место назначения для всего, что он скомпилировал. В вашем примере это не C:\Users\John\Scala\Examples\example, но C:\Users\John\Scala\Examples. Каталог example где scala будет искать классы, принадлежащие к пакету example.

Вот почему все не сработало: ожидается, что пакет example будет найден в каталоге, но такой каталог не существует в текущем каталоге, в котором вы запускали scala, и файлы классов, которые присутствовали на ожидается, что текущий каталог будет включен в пакет по умолчанию.

Ответ 2

Лучший способ сделать это - расширить App, который является немного особым классом (или, по крайней мере, DelayedInit, который лежит в основе его):

package example

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

По-прежнему можно добавлять методы к этому, тело объекта выполняется при запуске.

Ответ 3

Здесь вы идете:

scala -e 'example.Test.print'