Делать что-то вроде Python "импорт" в Scala - PullRequest
5 голосов
/ 30 апреля 2011

Можно ли использовать Scala import без указания главной функции в объекте и без использования ключевого слова package в исходном файле с кодом, который вы хотите импортировать?

Некоторое объяснение:В Python я могу определить некоторые функции в некотором файле "Lib.py", записать

from Lib import *

в другой файл "Run.py" в том же каталоге, использовать функции из Lib в Run изатем запустите команду Run с помощью команды python Run.py.Этот рабочий процесс идеально подходит для небольших сценариев, которые я мог бы написать за час.

В Scala, похоже, что если я хочу включить функции из другого файла, мне нужно начать оборачивать вещи в лишние объекты.Я бы предпочел не делать этого.

Ответы [ 4 ]

1 голос
/ 02 мая 2013

Это минимально, насколько я мог бы получить:

[$]> cat foo.scala
object Foo {
   def foo(): Boolean = {
      return true
   }
}

// vim: set ts=4 sw=4 et:
[$]> cat bar.scala
object Bar extends App {
    import Foo._

    println(foo)
}

// vim: set ts=4 sw=4 et:
[$]> fsc foo.scala bar.scala
[$]> export CLASSPATH=.:$CLASSPATH # Or else it can't find Bar.
[$]> scala Bar
true
1 голос
/ 01 мая 2011

Написание Python на Scala вряд ли даст удовлетворительные результаты. Объекты не являются «лишними» - это ваша программа, которая не написана объектно-ориентированным способом.

Во-первых, методы должны быть внутри объектов. Вы можете поместить их в package object, и они будут видны всему, что находится внутри упаковки с тем же именем.

Во-вторых, если рассматривать только объекты и классы, то все объекты и классы без пакетов, файлы классов которых присутствуют в пути к классам, или файлы scala которых скомпилированы вместе, будут видны друг другу.

0 голосов
/ 28 сентября 2016

Объекты / классы не обязательно должны быть в пакетах, хотя это настоятельно рекомендуется.Тем не менее, вы также можете рассматривать одноэлементные объекты как пакеты, т. Е. Как пространства имен для автономных функций, и импортировать их содержимое, как если бы они были пакетами.

Если вы определяете свое приложение как объект, расширяющий приложение, вам не нужно определять основной метод.Просто напишите свой код в теле объекта, и черта App (которая расширяет особую черту DelayedInit) предоставит основной метод, который будет выполнять ваш код.

Если вы просто хотите написать скрипт, вы можете вообще отказаться от объекта и просто написать код без контейнера, а затем передать исходный файл интерпретатору (REPL) в неинтерактивном режиме.

0 голосов
/ 05 мая 2011

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

...