【问题标题】:accept multiple types and numbers of parameters scala接受多种类型和数量的参数scala
【发布时间】:2012-09-23 20:06:47
【问题描述】:

我正在开发的程序中有类似于以下代码的内容(仅带有更多参数):

class Particle {
   //variables
   def this(position: Position2D, velocity: Vector2D) = {
   this()
   //constructors
   }

   def this(xPos: Double, yPos: Double, magnitude: Double, angle: Double) = {
   this(new Position2D(xPos, yPos), new Vector2D(magnitude, angle))
   }
}

我想让程序能够接受第一个参数的Position2D对象和第二个参数的两个Doubles,或者第一个参数的两个Doubles和一个@987654325 2nd 参数的 @ 对象,而无需为每个参数组合创建更多 this 语句。我知道可以使用类似的东西:

def this(posObj: Either[Position2D, Array[Double]], velObj: Either[Vector2D, Array[Double]]) = {...}

然后测试一下posObjvelObj是什么类型;但是,我很好奇是否有一种方法可以做到这一点,而不需要 Either 的第 2nd 部分只是一个项目,例如 Array,以便您可以初始化 @987654332 @像下面这样:

val a = new Particle(new Position(3, 6), 30, 5)
val b = new Particle(3, 6, new Vector2D(30, 5))
val c = new Particle(new Position(3, 6), new Vector2D(30, 5))
val d = new Particle(3, 6, 30, 5)

【问题讨论】:

    标签: scala types parameters constructor


    【解决方案1】:

    一个可能的解决方案是在构造函数中创建具有 2 个参数列表的类,一个采用 Position2D,一个采用 Vector2D,然后创建从 Tuple2 到它们两者的隐式转换:

    case class Vector2D(x: Double, y: Double)
    case class Position2D(x: Double, y: Double)
    
    implicit def tuple2Vector2D(t: (Double,Double)): Vector2D = Vector2D(t._1, t._2)
    implicit def tuple2Position2D(t: (Double,Double)): Position2D = Position2D(t._1, t._2)
    
    class Particle(val v: Vector2D)(val p: Position2D)
    
    scala> new Particle(1.1,3.1)(6.1,0.3)
    res15: Particle = Particle@15a74f84
    
    scala> new Particle(new Vector2D(1.1,3.1))(6.1,0.3)
    res16: Particle = Particle@47283198
    
    scala> new Particle(1.1,3.1)(new Position2D(6.1,0.3))
    res17: Particle = Particle@2571e404
    
    scala> new Particle(new Vector2D(1.1,3.1))(new Position2D(6.1,0.3))
    res18: Particle = Particle@38be7bc0
    

    【讨论】:

      【解决方案2】:

      简短的回答是否定的,构造函数是严格的,因为方法(或本例中的构造函数)的参数数量(假设您不希望它们出现在 Seq 中)必须非常具体。

      可能通过将裸对包含在 Tuple2 中并创建一个类型类实例来解包每个这将是可能的,但这将比仅添加构造函数复杂一个数量级。

      【讨论】:

        猜你喜欢
        • 2012-03-25
        • 2016-01-25
        • 2021-02-05
        • 2016-02-29
        • 2023-01-05
        • 2021-06-11
        • 1970-01-01
        • 2020-08-10
        • 2017-09-28
        相关资源
        最近更新 更多