Scala 在Lift框架中使用的类中对象模式是如何工作的?
我是scala的新手,无法理解电梯工人是如何实现RecordAPI的。然而,问题不在于此API,而在于Scala的总体情况。我对Lift中使用的类中对象模式的工作方式感兴趣Scala 在Lift框架中使用的类中对象模式是如何工作的?,scala,lift,mapper,Scala,Lift,Mapper,我是scala的新手,无法理解电梯工人是如何实现RecordAPI的。然而,问题不在于此API,而在于Scala的总体情况。我对Lift中使用的类中对象模式的工作方式感兴趣 class MainDoc private() extends MongoRecord[MainDoc] with ObjectIdPk[MainDoc] { def meta = MainDoc object name extends StringField(this, 12) object cnt exte
class MainDoc private() extends MongoRecord[MainDoc] with ObjectIdPk[MainDoc] {
def meta = MainDoc
object name extends StringField(this, 12)
object cnt extends IntField(this)
}
object MainDoc extends MainDoc with MongoMetaRecord[MainDoc]
在上面的代码段中,您可以看到如何在Lift中定义记录。有趣的是,字段被定义为对象。API允许您创建如下实例:
val md1 = MainDoc.createRecord
.name("md1")
.cnt(5)
.save
val name = md1.name
这可能是通过使用apply方法完成的?但同时,您可以通过以下操作获得值:
val md1 = MainDoc.createRecord
.name("md1")
.cnt(5)
.save
val name = md1.name
这一切是如何运作的?对象在类的作用域中不是静态的。或者它们只是一些内部表示的构造函数类?如何迭代所有字段,是否使用反射
谢谢,
奥托你说得对,它是
apply
方法。记录定义了一些apply
方法
def apply(in: Box[MyType]): OwnerType
def apply(in: MyType): OwnerType
通过返回OwnerType
,可以将调用链接在一起
关于使用object
定义字段的问题,一开始我也很困惑。对象
标识符定义特定范围内的对象。尽管可以方便地将对象
视为。根据(第5.4节):
它大致相当于以下惰性值的定义:lazy val m=带有mt1的新sc,带有。。。使用mtn{this:m.type=>stats}
上面给出的展开对于顶级对象不精确。这不能是因为变量和方法定义不能出现在
包对象(§9.3)。相反,顶级对象被转换为静态场
关于迭代所有字段,
Record
对象定义了一个allFields
方法,该方法返回一个列表[net.liftweb.Record.Field[\uu,MyType]]
您认为它是apply
方法是正确的。记录定义了一些apply
方法
def apply(in: Box[MyType]): OwnerType
def apply(in: MyType): OwnerType
通过返回OwnerType
,可以将调用链接在一起
关于使用object
定义字段的问题,一开始我也很困惑。对象
标识符定义特定范围内的对象。尽管可以方便地将对象
视为。根据(第5.4节):
它大致相当于以下惰性值的定义:lazy val m=带有mt1的新sc,带有。。。使用mtn{this:m.type=>stats}
上面给出的展开对于顶级对象不精确。这不能是因为变量和方法定义不能出现在
包对象(§9.3)。相反,顶级对象被转换为静态场
关于迭代所有字段,Record
对象定义了一个allFields
方法,该方法返回一个列表[net.liftweb.Record.Field[\uu,MyType]]
Otto
在正确的轨道上,你是多多少少。实际上,您不需要将字段定义为对象,您可以将示例编写为
class MainDoc private() extends MongoRecord[MainDoc] with ObjectIdPk[MainDoc] {
def meta = MainDoc
val name = new StringField(this, 12)
val cnt= new IntField(this)
}
object MainDoc extends MainDoc with MongoMetaRecord[MainDoc]
net.liftweb.record.Field特征确实包含一个与set等效的apply方法。这就是为什么在实例化对象后可以按名称分配字段
您提到的现场参考:
val name = md1.name
将名称键入为StringField。如果你想的是
val name: String = md1.name
这将无法编译(除非在转换字段[T]=>T的作用域中有一个隐式值)。检索字段字符串值的正确方法是
val name = md1.name.get
记录确实使用反射来收集字段。在类中定义对象时,编译器将创建一个字段来保存对象实例。从反射的角度来看,对象看起来非常类似于我前面提到的定义场的另一种方式。每个定义都可能创建字段类型的子类,但这与
val name = new StringField(this, 12) {
override def label: NodeSeq = <span>My String Field</span>
}
val name=new-StringField(这个,12){
覆盖def标签:NodeSeq=我的字符串字段
}
奥托
在正确的轨道上,你是多多少少。实际上,您不需要将字段定义为对象,您可以将示例编写为
class MainDoc private() extends MongoRecord[MainDoc] with ObjectIdPk[MainDoc] {
def meta = MainDoc
val name = new StringField(this, 12)
val cnt= new IntField(this)
}
object MainDoc extends MainDoc with MongoMetaRecord[MainDoc]
net.liftweb.record.Field特征确实包含一个与set等效的apply方法。这就是为什么在实例化对象后可以按名称分配字段
您提到的现场参考:
val name = md1.name
将名称键入为StringField。如果你想的是
val name: String = md1.name
这将无法编译(除非在转换字段[T]=>T的作用域中有一个隐式值)。检索字段字符串值的正确方法是
val name = md1.name.get
记录确实使用反射来收集字段。在类中定义对象时,编译器将创建一个字段来保存对象实例。从反射的角度来看,对象看起来非常类似于我前面提到的定义场的另一种方式。每个定义都可能创建字段类型的子类,但这与
val name = new StringField(this, 12) {
override def label: NodeSeq = <span>My String Field</span>
}
val name=new-StringField(这个,12){
覆盖def标签:NodeSeq=我的字符串字段
}