我很惊讶看到ScalaPB生成的代码如下:
object KinesisMessageType extends {
@SerialVersionUID(0L)
case object Empty extends com.example.message.KinesisMessage.KinesisMessageType {
// ...
}
}
您可以在不指定任何内容的情况下编写extends
吗?为什么允许这样?这个语法有没有文档?
答案 0 :(得分:3)
实际上 < / p>
A extends <anonymous class>
省略了A
的主体。因此extends
不是A
,而是extends { ... }
的正文,而是A
后跟class cc[tps] as m(ps_1)…(ps_n) extends t
的空身。
<强> 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。 我认为,严格地说,通过规范它应该是非法的:定义 object
或class
不允许那里,以及
每个早期定义必须至少定义一个变量。
但是,在这种情况下,它是合法的,因为ClassDef
以ClassTemplateOpt
结尾,定义为
ClassTemplateOpt ::= `extends' ClassTemplate | [[`extends'] TemplateBody]
和{ ... }
是TemplateBody
,即类的主体(类似于特征)。该规范并未说明extends
允许TemplateBody
之前的原因,但确实如此。