【问题标题】:access private vars in tests in Scala without casting在 Scala 中的测试中访问私有变量而不进行强制转换
【发布时间】:2017-12-19 05:24:30
【问题描述】:

我需要你的帮助来解决我遇到的这个 Scala 问题。

我有一个类层次结构:车辆只有每个车辆的公共变量,然后是 3 个子类:汽车、卡车和摩托车,每个人都有自己的特定变量。 我在辅助对象方法中使用模式匹配来根据车辆类型进行一些转换:

object Transformation {
    def someTransformation(vehicle:Vehicle):Vehicle = {
        vehicle match {
            case Car(<<<vars>>>) => Car(<<< transformed vars>>>)
            case Truck(<<<vars>>>) => Truck(<<< transformed vars>>>)
            case MotorCycle(<<<vars>>>) => MotorCycle(<<< transformed vars>>>)
        }
    }
}

我的问题是当我必须对其进行测试时,因为我要返回车辆(假设是一个 mixin),我必须在每次它出现时进行强制转换才能访问所涉及车辆的私有变量。 我想要一种方法让这段代码保持原样,并在测试中访问私有成员而不进行强制转换,因为我知道我作为参数收到的车辆与我返回的车辆类型相同。 这可以通过泛型解决吗?如何?

谢谢,希望可以理解。

【问题讨论】:

  • 我猜你的意思不是真的 private 类的成员,只是子类特定的?
  • 正是 Nimrod Argov

标签: scala casting pattern-matching


【解决方案1】:

我认为您要做的是对函数someTransformation 的返回类型进行限制。您希望 someTransformation 仅返回调用它的车辆类型。

以下是使用上下文边界执行此操作的方法:

trait Vehicle
case class Car(a: Int) extends Vehicle
case class Truck(b: Int) with Vehicle
case class MotorCycle(c: Int) with Vehicle

object Transformation {
  trait Transformer[V <: Vehicle] {
    def transform(v: V): V
  }

  implicit val carTransformer = new Transformer[Car] {
    override def transform(c: Car): Car = Car(c.a + 1)
  }

  implicit val truckTransformer = new Transformer[Truck] {
    override def transform(t: Truck): Truck = Truck(t.b + 10)
  }

  implicit val motorCycleTransformer = new Transformer[MotorCycle] {
    override def transform(m: MotorCycle): MotorCycle = MotorCycle(m.c + 100)
  }

  def someTransformation[V <: Vehicle : Transformer](v: V): V = {
    implicitly[Transformer[V]].transform(v)
  }
}

Transformation.someTransformation(Car(1)) // results in Car(2)
Transformation.someTransformation(Truck(1)) // results in Truck(11)
Transformation.someTransformation(MotorCycle(1)) // results in MotorCycle(101)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-17
    • 2011-08-31
    • 2011-05-03
    • 2012-07-13
    • 2019-09-27
    • 2019-03-25
    • 1970-01-01
    相关资源
    最近更新 更多