Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 在Lift框架中使用的类中对象模式是如何工作的?_Scala_Lift_Mapper - Fatal编程技术网

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

我是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 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=我的字符串字段
}