класс не может иметь main() в scala?

#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.