可以`extends`后面没有值吗?

时间:2017-06-30 23:31:44

标签: scala

我很惊讶看到ScalaPB生成的代码如下:

object KinesisMessageType extends {
    @SerialVersionUID(0L)
    case object Empty extends com.example.message.KinesisMessage.KinesisMessageType {
      // ...
    }
}

您可以在不指定任何内容的情况下编写extends吗?为什么允许这样?这个语法有没有文档?

3 个答案:

答案 0 :(得分:3)

实际上A extends <anonymous class>省略了A的主体。因此extends不是A,而是extends { ... }的正文,而是A后跟class cc[tps] as m(ps_1)…(ps_n) extends t的空身。 < / p>

<强> UPD 即可。正如@MichaelZajac指出的那样,在代码片段的AST中没有提到匿名类(https://astexplorer.net/#/gist/3e00495d23a70a4ae1e00d77a8a6ee53/20f89ada3f279e5c26ff776334853b2be2e38d3f

所以现在我相信@AlexeyRomanov通过尝试从解析器的POV解释这个来选择正确的方法,但我已经对此有了完整的解释:

首先,请注意:

  

最常见的类定义形式是(n≥0)(n≥0)sc with mt_1 with … with mt_m { stats } // m≥0

接下来,这个:

  

t extends sc with mt_1 with … with mt_m

形式的模板

最后,这个:

  

可以省略extends子句extends scala.AnyRef,在这种情况下假设object A extends <template>

所以,我认为,我们有一个<template>,其中extends遗留了{stats},因此只有$('.show_movement_icon').click(function() { // ... copy lines from your code ... $.getJSON(url, function(data) { //To get only market cap values. var market_cap = data.market_cap; for(var i=0; i < market_cap.length; i++) { //example: 06-06-2017 07:04:13 datum = new Date(market_cap[i][0]).format('d-m-Y h:m:s'); novetocke += "{ date: '" + datum + "', marketcap: " + market_cap[i][1] + " }, "; } // I changed the following 3 lines novetocke_edit = novetocke.substring(0, novetocke.length-2); var chartData = JSON.parse(novetocke_edit); morbar.setData(chartData); }); }); 块存在。

答案 1 :(得分:2)

是的,你可以。根据{{​​3}}:

  

可以省略extends子句[...],在这种情况下会假设扩展scala.AnyRef。

答案 2 :(得分:1)

此语法通常用于early definitions我认为,严格地说,通过规范它应该是非法的:定义objectclass不允许那里,以及

  

每个早期定义必须至少定义一个变量。

但是,在这种情况下,它是合法的,因为ClassDefClassTemplateOpt结尾,定义为

ClassTemplateOpt  ::=  `extends' ClassTemplate | [[`extends'] TemplateBody]

{ ... }TemplateBody,即类的主体(类似于特征)。该规范并未说明extends允许TemplateBody之前的原因,但确实如此。