有人可以帮我理解下面的代码有什么问题吗?问题出在“join”方法中 - 我无法设置“state”字段。错误消息是 -
No implicit view available from code.model.Membership.MembershipState.Val => _14.MembershipState.Value.
[error] create.member(user).group(group).state(MembershipState.Accepted).save
[error] ^
[error] one error found
[error] (compile:compile) Compilation failed
_14是什么意思?我尝试了与MappedGender类似的东西,它按预期工作,那么为什么MappedEnum会失败呢?
scala 2.10 提升2.5
由于
package code
package model
import net.liftweb.mapper._
import net.liftweb.util._
import net.liftweb.common._
class Membership extends LongKeyedMapper[Membership] with IdPK {
def getSingleton = Membership
object MembershipState extends Enumeration {
val Requested = new Val(1, "Requested")
val Accepted = new Val(2, "Accepted")
val Denied = new Val(3, "Denied")
}
object state extends MappedEnum(this, MembershipState)
{
override def defaultValue = MembershipState.Requested
}
object member extends MappedLongForeignKey(this, User) {
override def dbIndexed_? = true
}
object group extends MappedLongForeignKey(this, Group) {
override def dbIndexed_? = true
}
}
object Membership extends Membership with LongKeyedMetaMapper[Membership] {
def join (user : User, group : Group) = {
create.member(user).group(group).state(MembershipState.Accepted).save
}
}
答案 0 :(得分:1)
尝试将MembershipState
枚举移到MembershipClass
之外。在我尝试这个之前,我遇到了同样的错误。不知道为什么,但在我做完之后编译的代码。
答案 1 :(得分:1)
_14表示编译器生成的中间匿名值。换句话说,编译器不知道如何以更好的方式表达它所看到的类型。
但是如果你看过去,你会看到编译器正在寻找从[...] Val到[...]的转换。值。我猜这会改变
val Requested = new Val(1, "Requested")
到
val Requested = Value(1, "Requested")
会解决错误。
(我很好奇你在哪里选择了“新Val”风格?)
奇怪的是,Val实际上扩展了价值。因此,如果外部类型被正确地知道(不推断为奇数_14),则Val与Value不会成为问题。这里的问题是Lift从某种原因定义了setter采用现在不赞成的视图绑定语法。也许这会导致编译器,而不是直线并尝试将输入类型拟合到期望的类型,而是从两端开始,定义起始类型和所需类型,然后开始搜索隐式视图函数这可以调和两者。