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

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

var name:String = _

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

class Person(var name:String) 

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

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

Ответы [ 3 ]

19 голосов
/ 03 сентября 2011

Если вы используете код, подобный следующему, вы заявляете, что 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 , видит только объявления. Нет никакого способа неверно истолковать их, потому что там нет ничего, кроме деклараций. Единственная путаница возникает, когда вы пришли с другого языка и на секунду предположите, что есть некоторые значения по умолчанию. Но эта путаница исчезла, как только вы увидите первый пример (со значениями по умолчанию). Кстати, ваш класс должен быть частью абстрактной иерархии, чтобы иметь возможность объявлять абстрактные члены, поэтому даже если вы новичок в языке, вы уже получите некоторую дополнительную помощь от компилятора.

Надеюсь, это ответит на ваш вопрос и удачного кодирования.

6 голосов
/ 03 сентября 2011

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

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

4 голосов
/ 03 сентября 2011

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

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) = () }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...