MappedEnum - 没有可用的隐式视图

时间:2013-06-13 19:52:53

标签: scala lift

有人可以帮我理解下面的代码有什么问题吗?问题出在“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
    } 
}

2 个答案:

答案 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采用现在不赞成的视图绑定语法。也许这会导致编译器,而不是直线并尝试将输入类型拟合到期望的类型,而是从两端开始,定义起始类型和所需类型,然后开始搜索隐式视图函数这可以调和两者。