Разве (не) ли Scala автоматически генерирует сеттеры? - PullRequest
4 голосов
/ 05 февраля 2011

Google и моя неисправная память дают мне подсказки, что это происходит, но все попытки заканчиваются.

class Y {
    var y = 0
}
var m = new Y()
m.y_(3)

error: value y_ is not a member of Y

Пожалуйста, скажите мне, что я делаю что-то не так. (Также: пожалуйста, скажите мне , что это такое Я делаю неправильно.)

EDIT

То, что я не делаю неправильно, или, по крайней мере, не единственное, что я делаю неправильно, - это то, как я вызываю сеттера. Следующие вещи также терпят неудачу, все с тем же сообщением об ошибке:

m.y_ // should be a function valued expression
m.y_ = (3) // suggested by Google and by Mchl
f(m.y_) // where f takes Int => Unit as an argument
f(m.y)  // complains that I am passing in Int not a function

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

И победитель ...

Фабиан, который указал, что у меня не может быть пробела между _ и =. Я подумал, почему это должно быть, и тогда мне пришло в голову:

Имя установщика для y равно , а не y_, это y_=!

Обратите внимание:

class Y {
     var y = 0
}
var m = new Y()
m.y_=(3)
m.y
res1: Int = 3
m.y_=
error: missing arguments for method y_= in class Y;
follow this method with `_` if you want to treat 
it as a partially applied function
       m.y_=
         ^
m.y_=_
res2: (Int) => Unit = 
def four(f : Int => Unit) = f(4) 
four(m.y_=)

m.y
res3: Int = 4

Еще один удачный день на StackExchange.

Ответы [ 3 ]

8 голосов
/ 05 февраля 2011

Это так. Они просто прозрачные.

m.y = 3

это фактически обращается к m.y через метод установки.

Прямо можно позвонить m.y_=(3)

1 голос
/ 05 февраля 2011
class Y(var y : Int = 0)

делает работу.

1 голос
/ 05 февраля 2011

Трудно судить по вашим примерам, но, похоже, вы пытались передать установщик в функцию, которая затем установит значение для него. То есть, глядя на это:

f(m.y_) // where f takes Int => Unit as an argument
f(m.y)  // complains that I am passing in Int not a function

... предполагает наличие функции f, в которой вы хотите установить значение с помощью переданного установщика.

Если это то, чем вы были после , то вы можете сделать это, определив f следующим образом:

def f(setter: Int => Unit) = setter(12)

... и затем передайте установщик на m следующим образом:

f(m.y_=)

Если m будет свежим экземпляром Y, то это приведет к тому, что y при m будет установлено равным 12. В приведенном выше фрагменте m.y_ = считается значением функции. После того, как оно передано, вы можете ссылаться на функцию, используя установщик имени параметра. Поскольку это функция, вы можете применить к ней, просто передав ей ожидаемый параметр, который является значением типа Int.

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