Подтвердить что ты не робот

Почему язык Scala требует инициализации переменной экземпляра вместо того, чтобы полагаться на значение по умолчанию?

Язык

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

var name:String = _

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

class Person(var name:String) 

Однако мне нужно объявить его в теле, потому что мне нужно использовать аннотацию Java, ElementType которой FIELD или METHOD; то есть его можно просто применить к переменной экземпляра или методу, объявленным в теле нашего класса.

Вопрос: Почему язык Scala требует инициализации переменной экземпляра - будь то значение по умолчанию _ или что угодно - объявлено в теле класса вместо того, чтобы полагаться на значение по умолчанию?

4b9b3361

Ответ 1

Вы можете применить аннотацию, указав ее как аргумент конструктора. Кроме того, вам может потребоваться мета-аннотация, чтобы ограничить, к какой цели используется аннотация, - см. http://www.scala-lang.org/api/2.10.2-RC2/index.html#scala.annotation.meta.package

Однако ваш вопрос о "полагаться на значение по умолчанию" несколько неясен. Инициализация с использованием подчеркивания соответствует присвоению значения переменной null. О каких других дефолтах вы думаете?

Ответ 2

Если вы используете следующий код, который вы декларируете, то name должен быть абстрактным:

class A {
  var name: String
}

Я полагаю, вы уже это знали. Поэтому ваш вопрос скорее синтаксический. Ответ согласован с другими возможными абстрактными кандидатами.

Предположим, вы хотите сделать что-то вроде этого:

class A {
   var variable: String = _ // variable has some default value (probably null)
   val value: String = _ // value cannot have any default values, since it cannot be reassigned later.
   def method: String = _ // method could return some default value (probably null)
   type theType = _ // what should the default type be? (Any perhaps?)
}

Последние три примера даже не компилируются. Теперь предположим, что вы хотите сделать что-то вроде этого:

class A {
   var variable: String
   val value: String
   def method: String
   type theType
}

С моей точки зрения, даже тот, кто едва понимает Scala , видит только объявления. Невозможно неверно истолковать их, потому что нет ничего, кроме деклараций. Единственная путаница возникает, когда вы приходите с другого языка и на секунду принимаете, что есть некоторые значения по умолчанию. Но эта путаница исчезнет, ​​как только вы увидите первый пример (тот, который имеет значения по умолчанию). И, кстати, ваш класс должен быть частью абстрактной иерархии, чтобы иметь возможность объявлять абстрактные элементы, поэтому, даже если вы новичок в языке, у вас уже есть дополнительная помощь от компилятора.

Я надеюсь, что это ответит на ваш вопрос и счастливое кодирование.

Ответ 3

Scala не имеет проблемы с "var name: String" в классе. Вы попробовали? Это не значит, что вы хотите это понимать. Это абстрактный var.

abstract class A {
  var name: String
}
// some possible uses for abstract vars
trait B { type T ; var name: T }
class B1 extends B { type T = Int ; var name: Int = 5 }
// hey, no storage
class B2 extends B { type T = String ; def name = "abc" ; def name_=(x: String) = () }