在Scala中将字符串转换为运算符

时间:2015-12-19 13:46:14

标签: string scala operators eval evaluate

如何将Scala中的字符串转换为相应的运算符? 给定两个整数和字符串" +"我想要添加这两个整数的结果。

2 个答案:

答案 0 :(得分:5)

最后一个问题非常简单:

def applyOperator(x: Int, y: Int, operator: String) = operator match {
  case "+" => x + y
  case "-" => x - y
  ...
}

可以尝试使用Twitter的Eval库或反射,但我不推荐使用更简单的解决方案。

对于第一个问题:运算符本身不是值,因此您无法将字符串转换为运算符"。但是你可以接近:将一个字符串转换为一个函数,它将添加(或减去等)其参数:

def stringToOperator(operator: String): (Int, Int) => Int = operator match {
  case "+" => _ + _
  case "-" => _ - _
  ...
}

你甚至可以将它概括一点,不仅仅用于整数:

def stringToOperator[A: Numeric](operator: String): (A, A) => A = operator match { ... }

(这也以明显的方式适用于第一个答案。)

答案 1 :(得分:1)

这一个

case class Evaluatee(v1: Int, operator: String, v2: Int)

object Evaluator {
  def raw(s: String)(v1: Int, v2: Int) = s match {
      case "+" => (v1 + v2)
      case "-" => (v1 - v2)
      case "*" => (v1 * v2)
      case "/" => (v1 / v2)
  }

  def evaluate(evaluatee: Evaluatee) =
    raw(evaluatee.operator)(evaluatee.v1, evaluatee.v2)
}

完成此测试:

  test("1+1=2"){
    assert(Evaluator.evaluate(Evaluatee(1, "+", 1)) == 2)
  }
  test("2-1=1"){
    assert(Evaluator.evaluate(Evaluatee(2, "-", 1)) == 1)
  }
  test("1+1=2 raw"){
    assert(Evaluator.raw("+")(1,1) == 2)
  }