ScalaではFunctionN
種類の間には関係がありませんので、それはアリティレベルの決まり文句なしにこれを実行することはできませんどこか、そこのすべての可能な数字を列挙せずにコンパニオンオブジェクトのapply
の方法に比べて抽象化への道はただませんメンバー。
CompanionN[A, B, C, ...]
個の特徴を手でこれを行うことができますが、それはかなり面倒です。
import shapeless.{ Generic, HList }, shapeless.ops.product.ToHList
class CaseClassCompanion[C] {
def tupled[P <: Product, R <: HList](p: P)(implicit
gen: Generic.Aux[C, R],
toR: ToHList.Aux[P, R]
): C = gen.from(toR(p))
}
そして:
あなたはこのように使用することができます
case class Book(id: Int, isbn: String, name: String)
object Book extends CaseClassCompanion[Book]
case class Author(id: Int, name: String)
object Author extends CaseClassCompanion[Author]
:
scala> Book.tupled((0, "some ISBN", "some name"))
res0: Book = Book(0,some ISBN,some name)
scala> Author.tupled((0, "some name"))
res1: Author = Author(0,some name)
あなたがかもしれないShapelessでは、次のようなものを書くことができますはるかに優れたソリューションを提供し、 CaseClassCompanion
の部分も必要ではありません。なぜなら、タプルをケースクラスに変換する一般的なメソッドを作ることができるからです(メンバータイプが並べられていると仮定します):
class PartiallyAppliedProductToCc[C] {
def apply[P <: Product, R <: HList](p: P)(implicit
gen: Generic.Aux[C, R],
toR: ToHList.Aux[P, R]
): C = gen.from(toR(p))
}
def productToCc[C]: PartiallyAppliedProductToCc[C] =
new PartiallyAppliedProductToCc[C]
そして:
scala> productToCc[Book]((0, "some ISBN", "some name"))
res2: Book = Book(0,some ISBN,some name)
scala> productToCc[Author]((0, "some name"))
res3: Author = Author(0,some name)
がある場合、コンパニオンオブジェクト上のapply
方法はETA-拡張機能にすることはできませんので、これは、最大22人のメンバー(とケースクラスのために動作します22以上の議論)。
'fromTuple'はこのメソッドの方がいいかもしれません。' apply'をタップするのは本当ですが、 'tupled'という結果を呼び出すのは、変換が_to_タプル_from_の –
ありがとうございました!!! – TheKojuEffect
@TravisBrown 1つのパラメータのケースクラスで同じ効果を得るにはどうすればよいですか? – vicaba