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语句,我怎么去写它以便它按预期执行。我想做什么,在编程世界中它叫什么?所以我自己也可以谷歌,并了解更多。
答案 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运算符是方法,可能会让你使用反射来找到它们,但我自己没有尝试过。