加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

斯卡拉 – 案例类和特征

发布时间:2020-12-16 21:33:23 所属栏目:安全 来源:网络整理
导读:我想创建一个特殊的计算器.我认为案例类对于操作来说是一个好主意: sealed class Exprcase class add(op1:Int,op2:Int) extends Exprcase class sub(op1:Int,op2:Int) extends Exprcase class mul(op1:Int,op2:Int) extends Exprcase class div(op1:Int,op2
我想创建一个特殊的计算器.我认为案例类对于操作来说是一个好主意:

sealed class Expr
case class add(op1:Int,op2:Int) extends Expr
case class sub(op1:Int,op2:Int) extends Expr
case class mul(op1:Int,op2:Int) extends Expr
case class div(op1:Int,op2:Int) extends Expr
case class sqrt(op:Int) extends Expr
case class neg(op:Int) extends Expr
/* ... */

现在我可以使用match-case来解析输入.
也许,我也应该使用特征(即:特质分配,特质交换等),这是可能的吗?这是一个好主意吗?

解决方法

在开始添加不那么明确的附加值的特征之前,您应该掌握正确的基础知识.你现在这样做的方式使这些类不是很有用,至少在构建经典AST(或“解析树”)时不是这样.想象一下4 *(3 5).在使用乘法运算之前,必须先评估加法.这让事情变得复杂.你通常想要的是能够“立刻”写下你的公式,例如: Mul(4,Add(3,5)).但是这不会那样,因为你不能将Ints或Doubles放入你自己的类层次结构中.通常的解决方案是Numbers的包装类,比如说“Num”.然后我们有:Mul(Num(4),Add(Num(3),Num(5)).这可能看起来很复杂,但现在你有“一下子”,你可以做一些事情,比如引入常量和变量,简化(例如Mul(Num(1),x) – > x),派生……

要做到这一点,你需要一些东西

sealed trait Expr {
  def eval:Int      
}
case class Num(n:Int) extends Expr {
  def eval = n
}
case class Neg(e: Expr) extends Expr {
  def eval = - e.eval() 
}
case class Add(e1: Expr,e2: Expr) extends Expr {
  def eval = e1.eval + e2.eval  
}
...

现在你可以编写一个解析器,将“4 *(3 5)”转换成Mul(Num(4),Num(5)),并通过调用该表达式的eval来获得结果.

Scala包含一个名为parser combinators的解析库.有关上述代码的示例,请参阅http://jim-mcbeath.blogspot.com/2008/09/scala-parser-combinators.html

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读