için hiçbir şey infers: filterById(id: Id)
Scala derleyici önce farklı bağlamlarda farklı şekillerde gördüğüm şey çalışıyorum jenerik argümanlar
Bu Scala sorgusu uzantılarını uzanan denedim budur:
trait TableWithId { self: Profile =>
import profile.simple._
trait HasId[Id] { self: Table[_] =>
def id: Column[Id]
}
implicit class HasIdQueryExt[Id: BaseColumnType, U]
(query: Query[Table[U] with HasId[Id], U]) {
def filterById(id: Id)(implicit s: Session) = query.filter(_.id === id)
def insertReturnId(m: U)(implicit s: Session): Id = query.returning(query.map(_.id)) += m
}
}
Bu iyi çalışıyor, orada gerçek bir sihir yok. Ancak Tablo türünde hiçbir kısıtlama olmadığından, filterById uyguladığım herhangi bir sorgu, özgünlüğünü kaybeder (şimdi bir jenerik Table with HasId[Id]
) ve artık sütunlarına erişemiyorum (_.id
ofcourse hariç).
Bu örtülü dönüştürme nasıl yazılacağını bilmiyorum, bu önlenir. Mümkün mü? Scala şimdi Kimliği türü için hiçbir şey infers çünkü şu "naieve" çözüm çalışmaz:
implicit class HasIdQueryExt[Id: BaseColumnType, U, T <: Table[U] with HasId[Id]]
(query: Query[T, U]) { ... }
aniden Kimliği tipi Hiçbir şey olarak anlaşılmaktadır ki bu tür garip buluyorum. Derleyici'yi bu Id türünü nerede arayacağımı nasıl anlarım?
Ben Slick aşina değilim, ama benim tahminim sizin çözüm bir genel parametre gerektirecektir olmasındandır: Ama kimliği için belirli türü kullanmak .: sonra
ve beton bileşeni için yaptığımız Bu, masanızın gerçek tipini alır ... 'HasId [Id, T <: HasId [Id, T]]' gibi bir şey. Ardından masanın gerçek tipini HasId ile T parametresi olarak geçirebilirsiniz. Edit: Ayrıca, yapısal tipler kullanmayı denediniz mi? http://java.dzone.com/articles/duck-typing-scala-structural Bu, yansımayı kullanacaktır ancak yine de statik güvenlik sağlar. –
Bunun en son yazdığım yaklaşımdan nasıl farklı olduğunu göremiyorum. Bu eşdeğer değil mi? Ve ben yapısal yazımın bu durumda yardımcı olduğunu düşünmüyorum. Sorun, yapısını korur. –