Неявный конструктор Scala - PullRequest
0 голосов
/ 05 мая 2018

Возможно ли в Scala создание объекта без фактического вызова его имени?

В частности, у меня есть:

val foo = Thing(
  Thingy(1,2,3),
  Thingy(4,5,6)
)

И мне интересно, можно ли это так назвать

val foo = Thing(
  (1,2,3),
  (4,5,6)
)

Ответы [ 2 ]

0 голосов
/ 05 мая 2018

Вот еще один подход:

case class Thingy(a: Int, b: Int, c: Int)

case class Thing(x: Thingy, y: Thingy)

object Thing {
   def apply(t1: Tuple3[Int, Int, Int], t2: Tuple3[Int, Int, Int]): Thing =
     Thing(Thingy(t1._1, t1._2, t1._3), Thingy(t2._1, t2._2, t2._3))
}
0 голосов
/ 05 мая 2018

Вы можете использовать неявное преобразование из Tuple3 в Thingy:

package example

case class Thingy(v1:Int, v2:Int, v3:Int)

object Thingy {
   implicit def tuple2Thingy(t: Tuple3[Int, Int, Int]) = Thingy(t._1, t._2, t._3)
   //add conversion in companion object
}

тогда вы можете использовать его так:

import example.Thingy._

val foo = Thing(
    (1,2,3),
    (4,5,6)
)

Если Thingy это vararg:

case class Thingy(v1:Int*)

object Thingy {
   implicit def tuple2ToThingy(t: Tuple2[Int, Int]) = Thingy(t._1, t._2)
   implicit def tuple3ToThingy(t: Tuple3[Int, Int, Int]) = Thingy(t._1, t._2, t._3)
   //etc until Tuple22
}
...