#scala
#scala
Вопрос:
Я новичок в Scala.
В файле Calulator.scala
class Calulator {
var brand: String ="HP"
def add(m:Int, n:Int):Int = m n
}
В файле CalculatorTest.scala
object CalulatorTest {
def main(args:Array[String]) {
val cal = new Calulator
println(cal.add(1,2))
}
}
Скомпилируйте два файла scala и запустите calculatorortest. Это работает.
Мой вопрос в том, могу ли я создать их как один файл scala, например Java?
В файле Calulator.scala
class Calulator {
var brand: String ="HP"
def add(m:Int, n:Int):Int = m n
def main(args:Array[String]) {
val cal = new Calulator
println(cal.add(1,2))
}
}
Это не сработает!!!
Я погуглил, и похоже, что main() должен быть в object .
Есть ли способ поместить их в один файл для запуска main()?
Комментарии:
1. Что плохого в том, чтобы просто поместить два в один файл?
2. Ошибка Java. Вы можете поместить столько кода, сколько захотите, в один файл, компилятору scala все равно.
3. Хорошо… дело в том, что вам нужно, чтобы ваш
main
метод был статическим. И Scala не допускает статических членов в классе. Scala — это совершенно новый язык, поэтому в нем будут вещи, которые полностью отличаются от Java.
Ответ №1:
Чтобы поместить их в один файл, используйте концепцию «Сопутствующего объекта».
Класс и сопутствующий объект должны находиться в одном файле и иметь одно и то же имя.
class Calculator {
var brand: String = "HP"
def add(m: Int, n: Int): Int = m n
}
object Calculator {
def main(args:Array[String]) {
val cal = new Calculator
println(cal.add(1,2))
}
}
Дальнейшее чтение: http://docs.scala-lang.org/tutorials/tour/singleton-objects.html
Комментарии:
1. @user2761895 — в дополнение к этому замечательному ответу я хотел бы сказать, в основном — привыкните к идее частого использования сопутствующих объектов в Scala. Это место для размещения статических данных, связанных с вашими классами. На самом деле, если вы когда-нибудь обнаружите, что создаете элемент экземпляра в классе, и значение не зависит от самого экземпляра, просто поместите элемент в сопутствующий объект и сделайте его статическим.
2. Спасибо FabFlying и @user2761895. Это то, что я хотел.
Ответ №2:
Простой ответ — нет, более глубокий ответ заключается в том, что компилятор scala ссылается на объект как на статический, а на класс он ссылается как на обычный.
когда вы хотите запустить Java-программу, ваш main должен быть объявлен как static, иначе JVM не распознает его как точку входа в вашу программу.
что касается вопроса о том, возможно ли объединить их оба, ответ заключается не в том, что так работает компилятор scala.
Компилятор создаст MyClass$.class для объекта scala и MyClass.class для класса scala вот почему вы никогда не должны называть свой класс чем-то вроде :
class MyClass$ {
}
потому что это переопределит сопутствующий объект для MyClass.