Понимание сопутствующего объекта в Scala - PullRequest
0 голосов
/ 07 сентября 2018

Во время изучения Scala я натолкнулся на интересную концепцию объекта-компаньона. Сопутствующий объект может использоваться для определения статических методов в Scala. Нужно немного разъяснений в приведенном ниже коде Spark Scala в отношении сопутствующего объекта.

 class BballStatCounter extends Serializable {
  val stats: StatCounter = new StatCounter()
  var missing: Long = 0

  def add(x: Double): BballStatCounter = {
    if (x.isNaN) {
      missing += 1
    } else {
      stats.merge(x)
    }
    this
  }
}
object BballStatCounter extends Serializable {
  def apply(x: Double) = new BballStatCounter().add(x)
}

Вышеупомянутый код вызывается с помощью val stat3 = stats1.map(b=>BballStatCounter(b)).

  1. Какова природа переменных stats и missing, объявленных в учебный класс? Это похоже на атрибуты класса Python?
  2. Какое значение здесь имеет метод apply?

Ответы [ 2 ]

0 голосов
/ 07 сентября 2018

Здесь stats and missing - это атрибуты класса, и каждый экземпляр BballStatCounter будет иметь свою собственную копию, как в Python.

В Scala метод apply служит для специальных целей: если у какого-либо объекта есть метод apply, и если этот объект используется в качестве нотации вызова функции, такой как Obj (), то компилятор заменяет ее на вызов метода apply, например, Obj. применить ().

Метод apply обычно используется в качестве конструктора в объекте Class Companion. Все классы коллекции в Scala имеют объект-компаньон с методом apply, поэтому вы можете создать список, например: List (1,2,3,4)

Таким образом, в приведенном выше коде BballStatCounter (b) будет скомпилирован в BballStatCounter.apply (b)

0 голосов
/ 07 сентября 2018
  1. stats и missing являются членами класса BcStatCounter.stats - это val, поэтому его нельзя изменить после определения.missing - это var, поэтому он больше похож на традиционную переменную и может быть обновлен, как в методе add.Каждый экземпляр BcStatCounter будет иметь этих членов.(В отличие от Python, вы не можете добавлять или удалять элементы из объекта Scala)

  2. Метод apply представляет собой ярлык, который делает объекты похожими на функции.Если у вас есть объект x с методом apply, вы пишете x(...), и компилятор автоматически преобразует его в x.apply(...).В этом случае это означает, что вы можете вызвать BballStatCounter(1.0), и это вызовет метод apply для объекта BballStatCounter.

Ни один из этих вопросов на самом деле не касается сопутствующих объектов,это просто обычная структура классов Scala.

Обратите внимание на замечания в комментариях о задаче нескольких вопросов.

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