Как изменить значение неизменяемого объекта - PullRequest
0 голосов
/ 20 февраля 2019
val factor = 3
val multiplier = (i:Int) => i * factor

если я позвоню multiplier(3), это даст нам вывод 9.

Что я хочу, это

multiplier(3)
output =9
multiplier(3)
output=6

Как изменить множитель для этого типа функциональностикак фактор неизменен?

Ответы [ 2 ]

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

Не знаю, если это хорошая идея

val factor = 3

// all this Wrap stuff is so that we don't have an implicit Int
class Wrap(var inner: Int)
implicit val tmp = new Wrap(factor + 1)
def multiplier(i: Int)(implicit w: Wrap) = { w.inner -= 1; w.inner * i }

и замените w.inner -= 1 на другие функции, если хотите.Или без последствий

class Wrap(var inner: Int)
var tmp = new Wrap(factor + 1)

def base(i: Int)(w: Wrap) = { w.inner -= 1; i * w.inner }
def multiplier(i: Int) = base(i)(tmp)

оба делают

multiplier(3)  // 9
multiplier(3)  // 6
multiplier(3)  // 3

Оба способа требуют создания var.Не понимаю, как еще можно это сделать, не усложняя.

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

Вы не можете изменить значение неизменяемого объекта.Это буквально , что означает английское слово «неизменный»: неизменяемый.Весь смысл функционального программирования в том, что вы никогда не меняете объекты, вы возвращаете только новые.

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