Выполнение чего-то вроде «импорта» Python в Scala

#scala #import #include

#scala #импорт #включить

Вопрос:

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

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

 from Lib import *
  

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

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

Комментарии:

1. #include и import просто немного не совпадают.

2. что плохого в использовании package инструкции в вашем файле?

3. @Эрик Флеминг, это скорее стилистическая проблема, чем практическая. Мне не нужны пространства имен или ООП в моем простом скрипте, поэтому я бы предпочел, чтобы мне их не навязывали. В конечном счете, это сводится, возможно, к двум дополнительным строкам кода в моем скрипте, но эти дополнительные строки все еще беспокоят меня. Теперь я перестану жаловаться и ценю Scala за то, что она делает хорошо 😉

Ответ №1:

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

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

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

Комментарии:

1. Спасибо за ваш ответ, который я воспринимаю как «нет». Правильно, что я говорю о написании простого скрипта, а не более сложной программы, которая выиграла бы от пространств имен и повсеместного ООП.

Ответ №2:

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

 [$]> 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
  

Ответ №3:

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

Ответ №4:

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

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

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