scala - 如何将一个 lambda 表达式对象分配给另一个对象?

标签 scala lambda

我有这种代码,我想将其中一个 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)

代码检查 operatorType 字符串,如果它匹配任何模式,则将 opSpecBoolVal 设置为某个值 true 或 false,并将一个 lambda 表达式分配给另一个对象,并且这是我发现很难将 lambda 对象分配给其他对象的地方。主要座右铭是不让其余代码知道 operatorType 字符串包含什么,并通过传递两个参数直接使用 exitCheck 并获得 bool 结果。

我曾研究过一种解决方案,其中我只有 exitCheck 部分在工作,但无法将 opSpecBoolVal 设置为 true 或 false。 这是部分有效的代码。

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

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

最佳答案

尝试

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

关于scala - 如何将一个 lambda 表达式对象分配给另一个对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56506812/

相关文章:

scala - 如何在scala的 ""中输出 "here docs""?

升级到 Spark 1.3.0 时出现 JAVA_HOME 错误

database - Slick 3 - 基于其他表以事务方式插入到多个表中

c# - 如何在方法调用周围添加常用功能?

java - 在 Java 中实现递归 lambda 函数

scala - 无法找到 IntelliJ Idea 12 的 SBT 插件

json - 如何在Play Framework中将Scala Map序列化为Json?

c# - 如何在 C# 中使用表达式创建动态 lambda 连接查询?

c# - "The specified type member ' 日期 ' is not supported in LINQ "

lambda - 使用 collect 时的并发数据结构和并行流