加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 重塑一个case类构造函数?

发布时间:2020-12-16 09:58:27 所属栏目:安全 来源:网络整理
导读:试图找到一种方法来“重塑”案例构造函数以填充一些默认值.以下是可能的吗? def reshape[T,R1 : HList,R2 : HList](h: R1): R2 = T = ???//examplecase class MyClass(a: Double,b: String,c: Int)val newConstructor = reshape[MyClass]('b - "bValue" ::
试图找到一种方法来“重塑”案例构造函数以填充一些默认值.以下是可能的吗?

def reshape[T,R1 <: HList,R2 <: HList](h: R1): R2 => T = ???

//example
case class MyClass(a: Double,b: String,c: Int)

val newConstructor = reshape[MyClass]('b ->> "bValue" :: HNil)

newConstructor('a ->> 3.1 :: 'c ->> 4 :: HNil)
res1: MyClass = MyClass(3.1,"bValue",4)

有可能是无形的还是我们必须走宏观路线?

解决方法

在代码或自定义类型类中几乎不需要更改就可以构造这样的整形器.我们将只有 prepend个参数列表,然后 align结果到LabelledGeneric [MyClass] #Repr:

import shapeless._
import syntax.singleton._
import ops.hlist._

class PartialConstructor[C,Default <: HList,Repr <: HList]
(default: Default)
(implicit lgen: LabelledGeneric.Aux[C,Repr]) {
  def apply[Args <: HList,Full <: HList]
  (args: Args)
  (implicit prepend: Prepend.Aux[Default,Args,Full],align: Align[Full,Repr]): C =
    lgen.from(align(default ++ args))
}

class Reshaper[C]() {
  def apply[Default <: HList,Repr <: HList]
  (default: Default)
  (implicit lgen: LabelledGeneric.Aux[C,Repr]) =
    new PartialConstructor[C,Default,Repr](default)
}

def reshape[C] = new Reshaper[C]

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读