为什么scala人不喜欢注释?

iro*_*ght 23 annotations scala

.NET中的属性是一个非常受欢迎的功能.并且在1.5 Annotations到处使用后,Java添加了Annotation,请参阅Java EE和Spring.但是很少有scala库使用注释.lift-json不要使用它.电梯记录不使用它.Squeryl不使用它.subcut不使用它.(它有编译器插件的注释)...只是命名了一些.

他们只在需要一些编译魔术时才使用注释.@tailrec,@ inline,@ BundProperty,@ Inject(在subcut中)......

Scala具有超灵活的类型系统,特性,隐式和Menifest [X].那么他们不需要运行时元数据?

是否有任何scala项目大量使用注释?

ps我认为动态应该是注释而不是特性.

jsu*_*eth 28

一般来说,我们不使用注释,因为我们并不需要很多东西.

我见过的几个地方使用了注释:

  • 额外类型系统(例如用于分隔连续的CPS插件或效果跟踪插件.
  • 与传统Java接口连接.(scala-mojo-support)
  • 执行/启用编译器优化,例如@inline@tailrec.

在Scala中,我们并不需要依赖注入框架,因为有几种方法可以执行不需要外部工具的依赖注入.您可以将DI配置与核心代码分开,但仍然使用Scala编写.请参阅:https: //github.com/jsuereth/scala-in-depth-source/blob/master/chapter11/src/main/scala/scalax/config/Test.scala

所以基本的答案是,注释没有任何问题,我们通常(还)不需要它们.


Dav*_*ker 13

对我来说,这通常是编译器强制类型安全的问题.看看Squeryl以及它与Hibernate等Java ORM的区别.Hibernate将使用@Id注释来表示主键,在Squeryl中,您将创建一个id成员,该成员由KeyedEntity特征指定.需要具有主键的实体(例如,更新和删除)的方法将在编译时大声崩溃(如果尚未定义).Squeryl中还有其他几个地方,其中类型安全构造取代了集合映射和日期/时间处理等注释.

我认为这是Scala社区中常见的思维方式.注释更多是运行时功能,并没有得到充分考虑.Scala编译器功能非常强大,可以将更多代码推送到可以验证的构造中,这对于那些愿意接受随之而来的复杂性的人来说是有意义的.