Scala Вспомогательные конструкторы - PullRequest
13 голосов
/ 09 декабря 2011

Ниже приведен класс Scala с конструкторами.Мои вопросы помечены ****

class Constructors( a:Int, b:Int ) {

def this() = 
{
  this(4,5)
  val s : String = "I want to dance after calling constructor"
  //**** Constructors does not take parameters error? What is this compile error?
  this(4,5)

}

def this(a:Int, b:Int, c:Int) =
{ 
  //called constructor's definition must precede calling constructor's definition
  this(5)
}

def this(d:Int) 
// **** no equal to works? def this(d:Int) = 
//that means you can have a constructor procedure and not a function
{
  this()

}

//A private constructor
private def this(a:String) = this(1)

//**** What does this mean?
private[this] def this(a:Boolean) = this("true")

//Constructors does not return anything, not even Unit (read void)
def this(a:Double):Unit = this(10,20,30)

}

Не могли бы вы ответить на мои вопросы в **** выше?Например Конструкторы не принимают параметры ошибки?Что это за ошибка компиляции?

Ответы [ 2 ]

13 голосов
/ 09 декабря 2011

Ответ 1:

scala> class Boo(a: Int) {
     |   def this() = { this(3); println("lol"); this(3) }
     |   def apply(n: Int) = { println("apply with " + n) }
     | }
defined class Boo

scala> new Boo()
lol
apply with 3
res0: Boo = Boo@fdd15b

Первый this(3) - это делегирование первичному конструктору. Второй this(3) вызывает метод применения этого объекта, то есть расширяется до this.apply(3). Обратите внимание на приведенный выше пример.

Ответ 2:

= является необязательным в определениях конструктора, поскольку они ничего не возвращают. Они имеют семантику, отличную от обычных методов.

Ответ 3:

private[this] называется модификатором доступа к объекту. Объект не может получить доступ к полям private[this] другого объекта, даже если они оба принадлежат одному и тому же классу. Таким образом, это строже, чем private. Обратите внимание на ошибку ниже:

scala> class Boo(private val a: Int, private[this] val b: Int) {
     |   def foo() {
     |     println((this.a, this.b))
     |   }
     | }
defined class Boo

scala> new Boo(2, 3).foo()
(2,3)

scala> class Boo(private val a: Int, private[this] val b: Int) {
     |   def foo(that: Boo) {
     |     println((this.a, this.b))
     |     println((that.a, that.b))
     |   }
     | }
<console>:17: error: value b is not a member of Boo
           println((that.a, that.b))
                                 ^

Ответ 4:

То же, что и ответ 2.

0 голосов
/ 22 февраля 2019

Относится к вопросу 2:

Поведение вспомогательного конструктора Scala

Это вызывает ошибку, отсутствие (по умолчанию) параметров для бросков int b и int c вызываемое определение конструктора должно предшествовать определению вызывающего конструктора

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...