将标识符作为Scala中的数据处理

时间:2015-08-05 15:28:12

标签: scala

case class Var(x: Int,y:Int)
def compare(v:Var,compare:String): Boolean = {
        v.x compare v.y //--NeedHelp
}
def getComp(v:Var,compName:String):Int={
        v.compName //--NeedHelp
}
val v = Var(2,3)
assert(true == compare(v,"<"))
assert(false == compare(v,"=="))
assert(false == compare(v,">"))
assert(2==getComp(v,"x"))
assert(3==getComp(v,"y"))

有两个// - NeedHelp语句,我怎么去写它以便它按预期执行。我想做什么,在编程世界中它叫什么?所以我自己也可以谷歌,并了解更多。

2 个答案:

答案 0 :(得分:0)

所以,我认为这里有两个问题:

首先,让代码正常工作:

对于一个非常简单但不是非常可扩展或强大的实现,您可以在字符串上“模式匹配”以决定要执行的操作:

def compare(v:Var,compare:String): Boolean = {
   compare match {
       case op if op == "<" => v.x < v.y
       case op if op == ">" => v.x > v.y
       case _ => false // not very robust, anything could be passed in.
   }
}

Side Note :值得考虑如何防止用户传入意外值 - 例如,如果函数采用类型为Operator的特征而不是仅仅采用字符串值,然后编译器将阻止传入无效值。

def getComp(v:Var,compName:String):Int={
  compName match {
    case name if name == "x" => v.x
    case name if name == "y" => v.y
    case _ => 0 // not very robust...
  }
}

上述两个陈述都可以使用if语句轻松实现,例如

def getComp(v:Var,compName:String):Int={
  if (compName == "x") 
    v.x
  else if (compName == "y")
    v.y
  else
    0 // again, not very robust.
}

类似模式的更高级实现可能会利用Scala的一些面向对象的特性来创建不同的表达式类型,并使用解析器来解析一串文本,将文本转换为表达式然后评估表达式。

其次,以回应“..这在编程世界中被称为什么?”

我认为这涵盖了许多领域。它涵盖了一个解释器,因为你在这里写的很多内容基本上都是一个解释器,即你传递一个表示比较操作的字符串,并在该操作的上下文中提供要评估的表单中的数据。它也可以称为简单的DSL(域特定语言)。

此外,仅仅是个人推荐,但我相信,如果我没记错的话,由Martin Odersky运营的Coursera Scala Course在其中一个视频中覆盖了一个非常简单的表达式评估示例(我想也许是第4周)。我记得,这是一个非常简单的问题,但它至少在高层次上表明了如何在Scala中实现这种方法。

答案 1 :(得分:0)

在一般情况下,您要找的是reflection

您还可以在reflection in Scala在线查找更多信息。据我所知,Scala运算符是方法,可能会让你使用反射来找到它们,但我自己没有尝试过。