Scala: как получить доступ к переменным в методе, определенном в другом блоке кода - PullRequest
0 голосов
/ 17 марта 2020

У меня следующий код:

.hof((key, value) => {
    Some(..some processing result on key,value)
      .filterNot(_.isEmpty)
      .map(x: X => {....my code processing x using key,value with output y})
  }
)

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

def myMethod(x: X) = {
   y = ....some computation....
   return y
}

Но мне нужен доступ ключ, значение в myMethod.

Есть ли способ получить это?

Ответы [ 2 ]

3 голосов
/ 17 марта 2020

Вы можете определить myMethod в форме карри:

def myMethod(key: Key, value: Value)(x: X) = {
  ... uses key and value ...
}

Затем вы можете частично применить его в map, передав ему пару ключ / значение, которая у вас есть в этой точке:

.map(myMethod(key, value))

Обратите внимание, что добавление пары ключ / значение к myMethod подписи не является своего рода "обманом"; если метод должен использовать ключ и значение, он должен передать их в качестве параметров.

Это замечательная вещь в FP; как только каждая функция объявляет все параметры, с которыми она работает, вы можете легко их составить.

Конечно, вы могли бы просто поместить myMethod где-нибудь в области видимости, где key и value будут доступны (= закрытие), но, объявив их как параметры, вы более гибки, и вы можете разместить метод где угодно.

2 голосов
/ 17 марта 2020

Вы можете определить метод локально следующим образом:

.hof((key, value) => {
  def myMethod(x: X) = {
   ???
  }

  Some(..some processing result on key,value)
    .filterNot(_.isEmpty)
    .map(myMethod)
  }
)

В противном случае вам придется передать (key, value) функции в качестве аргументов.

(См. Ответ от @slou c для советов о том, как использовать карри, чтобы сделать это чище)

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