Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.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 “的语法含义是什么?”`类声明头`{val\u name:Type=>;`class body`}";_Scala_Syntax - Fatal编程技术网

Scala “的语法含义是什么?”`类声明头`{val\u name:Type=>;`class body`}";

Scala “的语法含义是什么?”`类声明头`{val\u name:Type=>;`class body`}";,scala,syntax,Scala,Syntax,在阅读一些有关Scala的文章时,我发现了一些语法奇怪的示例,我可能理解不正确 class-Child[C//这里,它是什么意思? 变量roomie:选项[C]=无 def roomWith(aChild:C)={ 室友 一个房间=一些(这个) } } 班上的孩子[男孩] 我发现了类似的例子 这是否意味着我在类范围中将这个对象声明为按C的类型?它是一个自类型注释 这意味着类Child必须是C类型,即创建必须满足给定类的继承依赖项 一个小例子: scala> trait Baz defi

在阅读一些有关Scala的文章时,我发现了一些语法奇怪的示例,我可能理解不正确

class-Child[C//这里,它是什么意思?
变量roomie:选项[C]=无
def roomWith(aChild:C)={
室友
一个房间=一些(这个)
}
}
班上的孩子[男孩]
我发现了类似的例子


这是否意味着我在类范围中将
这个
对象声明为按
C
的类型?

它是一个自类型注释

这意味着类
Child
必须是
C
类型,即创建必须满足给定类的继承依赖项

一个小例子:

scala> trait Baz
defined trait Baz


scala> class Foo {
     | self:Baz => 
     | }
defined class Foo


scala> val a = new Foo
<console>:9: error: class Foo cannot be instantiated because it does not conform to its self-type Foo with Baz
       val a = new Foo
               ^

scala> val a = new Foo with Baz
a: Foo with Baz = $anon$1@199de181


scala> class Bar extends Foo with Baz
defined class Bar
scala>trait Baz
定义特征Baz
scala>class-Foo{
|self:Baz=>
| }
定义类Foo
scala>vala=新Foo
:9:错误:无法实例化类Foo,因为它不符合其自身类型Foo和Baz
val a=新Foo
^
scala>val a=带Baz的新Foo
a:Foo带Baz=$anon$1@199de181
scala>类栏用Baz扩展了Foo
定义的类栏
在这种情况下,
Foo
也必须是
Baz
。 为了满足这个需求,可以创建一个
Foo
实例。 此外,定义一个新类(在本例中为
Bar
)也需要
Baz

见:

除了JaimeJorge响应中的继承要求外,如果您想从内部类引用外部实例,还可以使用self类型为外部实例命名:

scala> class Company(name: String) {
     |   company =>
     |   class Department(name: String) {
     |     override def toString = "Department "+ name +" of "+ company.name
     |   }
     | }
defined class Company

scala> val c = new Company("ACME")
c: Company = Company@56a57bb2

scala> val d = new c.Department("Marketing")
d: c.Department = Department Marketing of ACME

self类型的一个非常有用的应用是CRTP()的一个不太详细的实现,例如

试图用继承“欺骗”将不起作用:

class Foo extends Base[Vec3] {
  add(v:Vec3) = v
}

//error: illegal inheritance;
//self-type Foo does not conform to Base[Vec3]'s selftype Base[Vec3] with Vec3
//      class Foo extends Base[Vec3] {
这是对这个问题的回答。
abstract class Base[Sub] {
  self:Sub =>
  def add(s:Sub) : Sub
}

case class Vec3(x:Double,y:Double,z:Double) extends Base[Vec3] {
  def add(that:Vec3) = Vec3(this.x+that.x, this.y+that.y, this.z+that.z)
}
class Foo extends Base[Vec3] {
  add(v:Vec3) = v
}

//error: illegal inheritance;
//self-type Foo does not conform to Base[Vec3]'s selftype Base[Vec3] with Vec3
//      class Foo extends Base[Vec3] {