`
zhouchaofei2010
  • 浏览: 1104473 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

scala自身类型 self-type 的作用

阅读更多

self type 作用通常为了分割大类到多个特质traits的。比如cake pattern蛋糕模式中会用到self type

官网解释如下:
 
 

self type

self type of a trait is the assumed type of this, the receiver, to be used within the trait. Any concrete class that mixes in the trait must ensure that its type conforms to the trait’s self type. The most common use of self types is for dividing a large class into several traits (as described in Chapter 29 of Programming in Scala.

 

 

 

 

 

例子在<<Programming in Scala>> 第29章 第4小节给出的例子代码如下

 

 

 

29.4 Splitting modules into traits
 
package quickanswer.chapter10
 
class Food(fn:String){
  var name:String=fn
}
 
class Recipe(var rn:String,var foodLst:List[Food],var desc:String){//食谱
 
}
 
trait FoodCategories {
  case class FoodCategory(name: String, foods: List[Food])
  def allCategories: List[FoodCategory]
}
 
 
trait SimpleFoods {
  object Pear extends Food("Pear")
  object Apple extends Food("Apple")
  def allFoods = List(Apple, Pear)
  def allCategories = Nil
}
 
abstract class Database extends FoodCategories {
  def allFoods: List[Food]
  def allRecipes: List[Recipe]
  def foodNamed(name: String) =
  allFoods.find(f => f.name == name)
}
 
object SimpleDatabase extends Database with SimpleFoods with SimpleRecipes
 
trait SimpleRecipes { // Does not compile
 // this: SimpleFoods =>   //注释掉这句话会编译错误,因为Apple, Pear 是定义在SimpleFoods 的
  object FruitSalad extends Recipe(
  "fruit salad",
  List(Apple, Pear), // Uh oh
  "Mix it all together."
  )
  def allRecipes = List(FruitSalad)
}
 
 
object SplittingModulesIntoTraits extends App {
 
}
 
代码解释
 
 

dividing a large class( SimpleDatabase ) into several traits  (SimpleFoods ,SimpleRecipes),而在 定义trait SimpleRecipes  中又需要SimpleFoods 中的内容, 但是编译器器并不知道   SimpleRecipes 是混入SimpleFoods 的,而  Apple, Pear 是定义在SimpleFoods中的的,所以编译会报错 ,    而通过self type 解决了这个问题

 
从技术上讲,self type 是一个表示this类型的假定的类型。从编程角度来说,self type 要求具体的类必须混入指定的特质,否则会报编译错误。 如过有一个trait 是混入在其他trait中的,则其他trait需要用假定的类型self type
 

当SimpleRecipes 添加 this: SimpleFoods =>   后,Pear会被暗中转化为this.Pear ,这样是安全的,因为任何混入SimpleRecipes 的具体类必须也要混入SimpleFoods  。这意味着Pear会是这个具体类的一个成员。混入SimpleRecipes 的抽象类和trait没哟这个限制,但是他们是不能通过new 实例化的。所哟this.Pear 是安全的

 
 
 

书本解释如下"

 
The problem here is that Pear is located in a different trait from the one that
uses it, so it is out of scope. The compiler has no idea that SimpleRecipes
is only ever mixed together with SimpleFoods.
There is a way you can tell this to the compiler, however. Scala provides
the self type for precisely this situation. Technically, a self type is an assumed
type for this whenever this is mentioned within the class. Pragmatically,
a self type specifies the requirements on any concrete class the trait is mixed
into. If you have a trait that is only ever used when mixed in with another
trait or traits, then you can specify that those other traits should be assumed.
In the present case, it is enough to specify a self type of SimpleFoods, as
shown in Listing 29.15:
 
trait SimpleRecipes {
this: SimpleFoods =>
object FruitSalad extends Recipe(
"fruit salad",
List(Apple, Pear), // Now Pear is in scope
"Mix it all together."
)
def allRecipes = List(FruitSalad)
}
Listing 29.15 · A SimpleRecipes trait with a self type.
 
Given the new self type, Pear is now available. Implicitly, the reference
to Pear is thought of as this.Pear. This is safe, because any concrete
class that mixes in SimpleRecipes must also be a subtype of SimpleFoods,
which means that Pear will be a member. Abstract subclasses and traits do
not have to follow this restriction, but since they cannot be instantiated with
new, there is no risk that the this.Pear reference will fail
分享到:
评论

相关推荐

    scala-java8-compat_2.11-0.7.0-API文档-中英对照版.zip

    赠送jar包:scala-java8-compat_2.11-0.7.0.jar; 赠送原API文档:scala-java8-compat_2.11-0.7.0-javadoc.jar; 赠送源代码:scala-java8-compat_2.11-0.7.0-sources.jar; 赠送Maven依赖信息文件:scala-java8-...

    scala-java8-compat_2.11-0.7.0-API文档-中文版.zip

    赠送jar包:scala-java8-compat_2.11-0.7.0.jar; 赠送原API文档:scala-java8-compat_2.11-0.7.0-javadoc.jar; 赠送源代码:scala-java8-compat_2.11-0.7.0-sources.jar; 赠送Maven依赖信息文件:scala-java8-...

    scala-parser-combinators-2.11-1.0.4-API文档-中文版.zip

    赠送jar包:scala-parser-combinators_2.11-1.0.4.jar; 赠送原API文档:scala-parser-combinators_2.11-1.0.4-javadoc.jar; 赠送源代码:scala-parser-combinators_2.11-1.0.4-sources.jar; 赠送Maven依赖信息...

    scala-parser-combinators_2.12-1.1.0-API文档-中英对照版.zip

    赠送jar包:scala-parser-combinators_2.12-1.1.0.jar; 赠送原API文档:scala-parser-combinators_2.12-1.1.0-javadoc.jar; 赠送源代码:scala-parser-combinators_2.12-1.1.0-sources.jar; 赠送Maven依赖信息...

    scala-compiler-2.11.8-API文档-中英对照版.zip

    赠送jar包:scala-compiler-2.11.8.jar; 赠送原API文档:scala-compiler-2.11.8-javadoc.jar; 赠送源代码:scala-compiler-2.11.8-sources.jar; 赠送Maven依赖信息文件:scala-compiler-2.11.8.pom; 包含翻译后...

    scala-intellij-bin-2016.3.9

    1. **Scala编译器和运行时库**:这是开发Scala项目所必需的基础组件,包括Scala编译器(scalac)和Scala标准库。 2. **插件本身**:包含用于在IntelliJ IDEA中集成Scala开发环境的代码和配置文件。这些文件使得IDE...

    scala插件 scala-intellij-bin-2018.3.5.zip scala-intellij-bin-2018.3.6.zip

    `scala-intellij-bin-2018.3.5.zip` 和 `scala-intellij-bin-2018.3.6.zip` 是两个版本的Scala插件,分别适用于IntelliJ IDEA的2018.3.5和2018.3.6版本。这些插件是为了增强IDE对Scala语言的支持,提供代码高亮、...

    scala-ide-plugin-eclipse

    scala eclipse插件.对应scala版本:2.10--2.11,对应eclipes版本:4.4--4.5. update site:http://download.scala-ide.org/sdk/lithium/e44/scala211/stable/site 下载地址:...

    scala-SDK-4.7.0-vfinal-2.12-linux.gtk.x86_64.tar.gz

    scala-SDK-4.7.0-vfinal-2.12-linux.gtk.x86_64.tar.gz scala-SDK-4.7.0-vfinal-2.12-linux.gtk.x86_64.tar.gz

    scala-intellij-bin-2018.3.2.zip

    scala-intellij-bin-2018.3.2.zip插件,亲测可用!!!scala-intellij-bin-2018.3.2.zip插件,亲测可用!!!scala-intellij-bin-2018.3.2.zip插件,亲测可用!!!

    scala-intellij-bin-2021.3.6.zip

    1. **类型系统**:Scala具有静态类型,但其类型推断机制使得编写代码时可以减少显式类型声明。它还支持泛型,允许编写可复用的类型安全代码。 2. **模式匹配**:Scala的模式匹配功能使得处理数据结构和解析数据变得...

    scala-intellij-bin-0.41

    Scala是一种强大的多范式编程语言,它融合了函数式编程和面向对象编程的特点。IntelliJ IDEA是一款广受赞誉的Java开发集成环境,为开发者提供了高效、智能的代码编写体验。"scala-intellij-bin-0.41"是专门为...

    intellij IDEA Scala语言插件 scala-intellij-bin-2020.3.6 最新版

    IDEA 全称 IntelliJ IDEA,是java编程语言开发的集成环境。IntelliJ在业界被公认为最好的java开发工具,尤其在智能代码助手、代码自动提示、重构、JavaEE支持、各类版本工具(git、...通过该插件可支持Scala语言的构建。

    scala-intellij-bin-2020.2.3.zip

    - **类型系统**:Scala具有强类型,支持类型推断,使得代码更简洁。 - **模式匹配**:允许开发者以一种声明式的方式处理数据结构。 - **高阶函数**:函数可以作为参数传递,也可以作为返回值。 - **类与对象**:...

    scala-intellij-bin-2016.3.1.zip

    例如,它可以为Scala项目自动生成构建文件(如.sbt或.build.properties),帮助开发者编写类型安全的代码,并提供跳转到定义、查找引用和重构等功能。此外,它还支持ScalaTest和ScalaCheck等测试框架,便于进行单元...

    scala-SDK-3.0.1-vfinal-2.10-win32.win32.x86

    scala-SDK-3.0.1-vfinal-2.10-win32.win32.x86.part01.rar

    scala-SDK-4.7.0-vfinal-2.12-win32.win32.x86_64

    2. **Scala库**:这个库提供了大量的内置模块和类,涵盖了从基本类型到高级功能,如并发、模式匹配和XML处理。Scala库与Java类库无缝集成,允许开发者使用现有的Java库。 3. **Scala REPL(Read-Eval-Print Loop)*...

    scala-intellij-bin-2017.2.13

    在实际开发中,Scala的特性如类型推断、模式匹配、高阶函数等,都能在IDE的辅助下得到更好的理解和应用。例如,类型推断使得开发者无需显式声明变量类型,而模式匹配则简化了数据解析和处理的过程。高阶函数则允许将...

    scala-intellij-bin-2019.1.2.zip

    首先,我们需要理解Scala插件的作用。在IntelliJ IDEA中安装此插件后,用户可以享受到一系列针对Scala开发的便利特性,如语法高亮、代码自动完成、错误检测、代码重构工具、调试器支持等。这些功能极大地提高了Scala...

    scala-intellij-bin-2019.2.28.zip

    1. **类型系统**:Scala的类型系统是静态的,这意味着编译时就能检测到大多数类型错误。同时,它支持类型推断,让代码更加简洁。 2. **模式匹配**:Scala中的模式匹配允许开发者以一种优雅的方式处理数据结构,比如...

Global site tag (gtag.js) - Google Analytics