如何使用类似镜头的方法创建嵌套的案例类

时间:2015-11-05 16:18:15

标签: scala shapeless

用镜头“修改”字段非常好:

case class Address(street : String, city : String, postcode : String)
case class Person(name : String, age : Int, address : Address)

val nameLens     = lens[Person] >> 'name
val ageLens      = lens[Person] >> 'age
val addressLens  = lens[Person] >> 'address
val streetLens   = lens[Person] >> 'address >> 'street
val cityLens     = lens[Person] >> 'address >> 'city
val postcodeLens = lens[Person] >> 'address >> 'postcode


val person = Person("Joe Grey", 37, Address("Southover Street", "Brighton", "BN2 9UA"))

val person2 = ageLens.modify(person)(_ + 1)

但是能够使用该语法创建整个类/记录会非常好,例如:

val personRaw: String :: Int :: (String :: String :: String :: HNil) :: HNil = 
   ('address >> 'postcode ->> "BN2 9UA") :: 
   ('name ->> "Joe Grey") ::
   ('age ->> 37) ::
   ('address >> 'street ->> "Southover Street") ::
   ('address >> 'city ->> "Brighton") ::   
   HNil

val personGen = Generic[Person]
personGen.from(personRaw) //here is type check

我没有发现这种无形状。是否有任何(类型安全)方式来实现类似的东西?

P.S。我为什么需要那个?我打算有一大堆这样的规则,所以很容易找到我们大实体的每个价值来自哪里。所以我目前的猜测是编写一个宏来处理这些记录,但也许有人已经这样做了。

0 个答案:

没有答案