this: Enumeration =>

yangzhan 2009-12-17
下面这段代码中:
this: Enumeration =>
这句有什么作用呢?

trait Enumv  {

  this: Enumeration =>

  private var nameDescriptionMap = scala.collection.mutable.Map[String, String]()

  /* store a name and description for forms */
  def Value(name: String, desc: String) : Value = {
    nameDescriptionMap += (name -> desc)
    new Val(name)
  }

    /* get description if it exists else name */
  def getDescriptionOrName(ev: this.Value) = {
    try {
      nameDescriptionMap(""+ev)
    } catch {
      case e: NoSuchElementException => ev.toString
    }
  }

  /* get name description pair list for forms */
  def getNameDescriptionList =  this.elements.toList.map(v => (v.toString, getDescriptionOrName(v) ) ).toList
}
fineqtbull 2009-12-17
第一次看到this: Enumeration => 这种用法,调查了一下大概知道它的用法了。this : T =>是Scala中self type的定义,也就是说由于Enumv中包含了this: Enumeration =>定义,所以实现Enumv的最终类必须也要具有Enumeration类的接口(比如继承),这样在Enumv中就可以使用Enumeration的方法或属性了。

以Enumv举例来说,可以这样定义和使用混入了Enumv特征的单例
scala> object Enum1 extends Enumeration with Enumv {
     | this : Enumeration =>
     | val Value1, Value2 = Value
     | }
defined module Enum1

scala> Enum1.Value1
res1: Enum1.Value = Enum1(0)

另外根据下面链接的内容,selftype似乎为了解决循环继承而发明的。
http://old.nabble.com/-scala--Selftype-example-td11384485.html#a11384485
night_stalker 2009-12-18
貌似很早之前写过一个关于它的 note …… explicit 什么什么的 ……
除了约束 this 的类型以外,还有一个作用是省去一些手工转换类型的功夫:
如果代码中有不少 this.asInstanceOf[XX],不妨考虑添上 this:XX =>
Global site tag (gtag.js) - Google Analytics