Как иметь сеттер в объекте? - PullRequest
1 голос
/ 16 октября 2019

Я пытаюсь добавить метод установки в объект:

object Foo {
  def foo_=(s: String) = println(s) 
}

Foo.foo = "test"

Это не работает должным образом, и компилятор жалуется на "значение foo не является членом объекта Foo".

Почему это не работает? Как я могу заставить его работать, кроме как сделать метод установки без _=?

Ответы [ 2 ]

4 голосов
/ 16 октября 2019

Кажется, это работает как раз в Scala 2.13

object Foo {
  private var f: String = ""

  def foo_=(s: String): Unit =
    this.f = s.toLowerCase

  def foo: String =
    this.f
}

Вы можете проверить, как показано ниже.

Foo.foo
// res: String = ""

Foo.foo = "HELLO"

Foo.foo
// res: String = "hello"
0 голосов
/ 17 октября 2019

Scala распознает этот метод как установщик, только если у вас есть получатель def foo = ...:

Если x - это метод без параметров, определенный в некотором шаблоне, и тот жешаблон содержит метод сеттера x_= в качестве члена, тогда присвоение x = e интерпретируется как вызов x_=(e) этого метода сеттера.

Из вашего комментария:

Похоже, что 2.12.9 это исправили. Это было сломано с версией, которую я использовал 2.12.8.

Тестирование на https://scastie.scala -lang.org / 8uAu5WCAQJa3darpMkCidg , я получаю ожидаемый результат: без получателязавершается с ошибками в 2.12.8 и 2.13.1, с одним он работает в обоих.

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