Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
case class Person(
name: String,
address: Address
)
object Person{
val name = slot[String]("name")
val address = slot[Address]("address")
}
Человек рождается с очень ограниченным набором свойств: иметь возраст, вес, рост, пищать, питаться и портить подгузник. Время идет, и он приобретает новые наборы свойств: ученик школы, покупатель, пассажир, солдат, студент, наемный работник, предприниматель, супруг, родитель и т.д. А возможно и не приобретает. Например, не каждый человек служит в армии, учится в вузе, женится и становится отцом или предпринимателем. Или утрачивает. Например, закончил учиться, отслужил в армии или развелся. Следовательно, один и тот же объект должен иметь возможность принадлежать разным классам и этот набор классов должен быть динамическим, т.е. изменяться в ходе эволюции объекта и самой программной системы. На набор классов, к которым относится объект, как правило, накладываются ограничения. Например. Чтобы стать солдатом, человек должен достичь 18 лет. А если человек студент то для того, чтобы стать мужем, необходимо сдать сопромат.
case class Person(val name: String, val address: Option[String])
val john = Person("John", None)
val john2 = john.copy(address = Some("22b Baker st")
type SlotsUnion = head.type with tail.SlotsUnion
with, который соответствует конъюнкции. Для проверки принадлежности мы инвертируем условие с помощью оператора <:< def get[SlotType<:SlotId[_](slotId:SlotType)(implicit ev: SlotSeq1#SlotUnion <:< SlotType) = ???
case class SlotDelta[T:Numeric, S <: SlotId[T]](slotId:S, delta:T)
case class SlotDelta[T:Numeric, S <: SlotId[T]](slotId:S, delta: T) {
def addTo(oldValue:SlotValue[T, S]) =
SlotValue(slotId, implicitly[Numeric[T]].plus(oldValue.value, delta))
}
implicit class SlotValueEx[T:Numeric, S <: SlotId[T]] (slotValue:SlotValue[T, S]) {
def +(delta:T) =
SlotValue(slotValue.slotId, implicitly[Numeric[T]].plus(slotValue.value, delta))
}
case class SlotDelta[S <: SlotId[Int]](slotId:S, delta: Int) {
def +:(oldValue:SlotValue[Int, S]) =
SlotValue(slotId, oldValue.value+ delta)
}
Конструирование типов в Scala