【问题标题】:ScalaJS: Facade for polymorphic objectScalaJS:多态对象的外观
【发布时间】:2016-01-05 03:49:14
【问题描述】:

我想从 ScalaJS 调用一个类似于以下的 JS 函数:

function parseExpression(s){
  if(isNumber(s)) return {lit:s}
  else{
    return {
      left : leftOp(s)
      oper : operand(s)
      right: rightOp(s)
    }
  }
}

返回的对象可以是两种不同的形状,{lit}{left, oper, right}

我在 ScalaJS 中定义了以下特征:

@js.native
trait NumLiteral extends js.Object{
  val lit:String = js.native
}

@js.native
trait NumOper extends js.Object{
  val left : NumLiteral | NumOper = js.native
  val oper : String = js.native
  val right: NumLiteral | NumOper = js.native
}

然后我可以将函数parseExpression 声明为Function1[String, NumLiteral | NumOper]

检查parseExpression(someExpressionString) 的返回值是NumLiteral 还是NumOper 类型的最佳方法是什么?我可以随意更改 JS 和/或 Scala 代码以实现最优雅的解决方案。

【问题讨论】:

    标签: scala.js


    【解决方案1】:

    我通过在 ScalaJS 中定义以下内容来解决它:

    trait NumExpr
    
    @JSExport
    class NumLiteral(val lit:String) extends NumExpr
    
    @JSExport
    class NumOper(val left:NumExpr, val oper:String, val right:NumExpr) extends NumExpr
    

    然后将我的 JS 函数重新定义为:

    function parseExpression(s){
      return isNumber(s) ?
        new NumLiteral(s) :
        new NumOper(leftOp(s), operand(s), rightOp(s))
    }
    

    这让我可以在 parseExpression(someExpressionString) 上进行模式匹配

    当然,这改变了原来的 JS 函数,因此改变了原来的问题,但它解决了我的问题。

    【讨论】:

      猜你喜欢
      • 2018-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-22
      • 2019-11-11
      • 1970-01-01
      相关资源
      最近更新 更多