#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) в неинтерактивном режиме.