Как назначить один объект лямбда-выражения другому? - PullRequest
3 голосов
/ 08 июня 2019

У меня есть такой код, где я хочу сохранить одно из лямбда-выражений в каком-либо объекте.

var opSpecBoolVal = false
val equalCheck = (x: Int, y: Int) => x == y
val greaterthanCheck = (x: Int, y: Int) => x > y
val lessthanCheck = (x: Int, y: Int) => x < y
val notEqualCheck = (x: Int, y: Int) => x != y

operatorType match {
   case "_equal" => opSpecBoolVal = false; exitCheck = equalCheck; 
   case "_greaterthan" => opSpecBoolVal = true; exitCheck = greaterthanCheck; 
   case "_lessthan" => opSpecBoolVal = false; exitCheck = lessthanCheck; 
   case "_notequal" => opSpecBoolVal = true; exitCheck = notEqualCheck;
}
exitCheck(10, 20)

код проверяет строку operatorType и, если она соответствует какому-либо шаблону, устанавливает opSpecBoolVal для некоторого значения true или false, и оно присваивает одно лямбда-выражение другому объекту, и именно здесь я испытываю трудности при назначении лямбда-объекта другому объекту.Главный девиз - не дать остальной части кода узнать, что содержит строка operatorType, и напрямую использовать exitCheck, передав два аргумента и получив логический результат.

Я работал над одним решением, в котором у меня работала только exitCheck часть, но я не смог установить opSpecBoolVal в true или false.Вот код, который частично работал.

val exitCheck = operatorType match {
   case "_equal" => equalCheck; 
   case "_greaterthan" => greaterthanCheck; 
   case "_lessthan" => lessthanCheck; 
   case "_notequal" => notEqualCheck;
}

Я хочу установить для opSpecBoolVal значение true или false одновременно.

1 Ответ

5 голосов
/ 08 июня 2019

Попробуйте

val exitCheck: (Int, Int) => Boolean = operatorType match {
  case "_equal" =>
    opSpecBoolVal = false
    _ == _

  case "_greaterthan" =>
    opSpecBoolVal = true
    _ > _

  case "_lessthan" =>
    opSpecBoolVal = false
    _ < _

  case "_notequal" =>
    opSpecBoolVal = true
    _ != _
}

который выводит

val operatorType = "_greaterthan"
exitCheck(10, 20) // res0: Boolean = false

Чтобы избежать установки var opSpecBoolVal в качестве побочного эффекта, попробуйте альтернативную чистую реализацию, например, так:

type OperatorType = String
type Operator = (Int, Int) => Boolean
type IsSpecialOp = Boolean

val toOp: OperatorType => (Operator, IsSpecialOp) =
{
  case "_equal" => (_ == _, false)
  case "_greaterthan" => (_ > _, true)
  case "_lessthan" => (_ < _, false)
  case "_notequal" => (_ != _, true)
}

который выводит

val (exitCheck, opSpecBoolVal) = toOp("_greaterthan")
exitCheck(10, 20) // res0: Boolean = false
opSpecBoolVal // res1: IsSpecialOp = true
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...