用镜头“修改”字段非常好:
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。我为什么需要那个?我打算有一大堆这样的规则,所以很容易找到我们大实体的每个价值来自哪里。所以我目前的猜测是编写一个宏来处理这些记录,但也许有人已经这样做了。