专注于快乐的事情

Scala

本文于1500天之前发表,文中内容可能已经过时。

Scala的设计哲学

Scala试图将以下三组对立的思想融合到一种语言中。

  • 函数式编程和面向对象编程。

  • 富有表达力的语法和静态类型。

  • 高级的语言特性同时保持与Java 的高度集成。

Scala 完全支持面向对象编程(OOP)。Scala 引入特征(trait)改进了 Java 的对象模型。trait 能通过使用混合结构(mixin composition)简洁地实现新的类型。在 Scala 中,一切都是对象,即使是数值类型。

## 接口 ##

租借模式(loaner pattern)

Scala 使用 trait 来替代接口

协变 和 逆变

如果某类型可以强制转换为子孙类,我们称为协变(+T 或? extends T),如果某类型可以强制转换为祖先类,我们称为逆变(-T 或? super T)。
如果某类型完全不能被强制转换,就称为不变(Invariance)

静态类型和表达力

Scala做了以下几个简单的设计决策,以提高代码表达力。

  • 把类型标注(type annotation)换到变量右边。
  • 类型推断。
  • 可扩展的语法。
  • 用户自定义的隐式转换

scala的简化规则

  • 无参数的方法可以用作后缀操作符(postfix operator)
  • 只有一个参数的方法可以当作中缀操作符(infix operator)。
  • 还有一些对特殊字符的专门规定,比如方法名的最后一个字符如果是“:”,则方法的调用方向反转
  • 在定义匿名函数时(又称 lambda),Scala 提供了占位符语法。可以使用“_”关键字作为函数参数的占位符。如果使用多个占位符,每个相应位置的占位符对应于相应位置的参数。

其他

Scala会自动地加载scala.Predef对象,使它的成员方法对所有程序可用。

implicit关键字在Scala里有两种不同用法。第一种用法是给方法声明一种特殊参数
如果编译器在作用域里找到了合适的值就会自动传递给方法。

implicit 关键字的另一种用法是把一种类型转换为另一种。有两种场景会发生隐式转换,第一种场景是当你给一个函数传递参数的时候,如果Scala发现函数需要的参数类型(跟传给它的)不一样,Scala 会首先检查类型继承关系,如果没找到,就会去查找有没有合适的隐式转换方法。

隐式转换方法只是普通的方法,用implicit 关键字做了标注。

第二种场景是当调用某类型的某方法时,如果编译器发现该类型没有这个方法,Scala 会对该查找适用于该类型的隐式转换,直到找到一个转换后具有该方法的结果。

Scala 鼓励使用作为对象的函数(function as object),或称一等函数

领域特定语言时(DSL)

用可变对象的代码一般倾向于用命令式(imperative)的风格编码

参考网站

评论系统未开启,无法评论!