Ответ 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.