如何将一个Lambda表达式对象分配给另一个?

dip*_*hah 3 lambda scala

我有这样的代码,我想将lambda表达式之一存储在某个对象中。

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)
Run Code Online (Sandbox Code Playgroud)

代码检查operatorType字符串,如果它与任何模式匹配,则将其设置opSpecBoolVal为true或false,并将一个lambda表达式分配给另一个对象,这就是我在将lambda对象分配给其他对象时遇到的困难。主要座右铭是不让其余代码知道operatorType字符串包含什么,而是exitCheck通过传递两个参数并获得布尔结果来直接使用。

我已经开发了一种解决方案,其中我只能exitCheck部分工作,但无法设置opSpecBoolVal为true或false。这是部分起作用的代码。

val exitCheck = operatorType match {
   case "_equal" => equalCheck; 
   case "_greaterthan" => greaterthanCheck; 
   case "_lessthan" => lessthanCheck; 
   case "_notequal" => notEqualCheck;
}
Run Code Online (Sandbox Code Playgroud)

我想同时设置opSpecBoolVal为true或false。

Mar*_*lic 5

尝试

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

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

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

  case "_notequal" =>
    opSpecBoolVal = true
    _ != _
}
Run Code Online (Sandbox Code Playgroud)

哪个输出

val operatorType = "_greaterthan"
exitCheck(10, 20) // res0: Boolean = false
Run Code Online (Sandbox Code Playgroud)

为避免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)
}
Run Code Online (Sandbox Code Playgroud)

哪个输出

val (exitCheck, opSpecBoolVal) = toOp("_greaterthan")
exitCheck(10, 20) // res0: Boolean = false
opSpecBoolVal // res1: IsSpecialOp = true
Run Code Online (Sandbox Code Playgroud)