- scala 名称来源于“可伸展的语言” 之所以这样得名是因为它被设计成可以随使用者的需求而扩展。 与你一同成长的语言。
- perl, python,ruby 推行的是一种“均码”哲学,然而 scala 可以在你需要的时候提供更细粒度的控制,因为它的很多特征并不是语法特性而是库抽象,可以扩展和改造。
- scala 允许用户通过定义感觉像原生语言支持一样的易用库在他们需要的方向上发展和改造语言。
- java 的线程模型围绕着共享内存和锁建立的,当系统规模和复杂度不断增加时这种模型越发变得难以理解,目前认为比较安全的可选方案是消息传递架构,例如 Erlang 的 actor 方案,scala 的actor 可以实现线程模型之上的并发抽象。
- 面向对象可以使最简单的对象与完整的计算机具有同样的架构原则。
- java 里面的原始值这些对纯理想化面向对象的背叛最初看起来无害,但令人头痛的事情还在后面,情况会变得复杂并限制了可扩展性。
- 函数编程有两种理念,第一种理念是函数是头等值与整数和字符串具有同样的地位可以传递和返回。函数编程的第二个理念是程序的操作应该将输入值映射成输出值而不是就地修改数据,这个理念的另一种解释是,方法不应该具有副作用,函数编程鼓励不变的数据结构和指称透明的方法。函数编程思想在面向对象中的应用就意味着对象的不可变性。
- 静态类型结构最常见的批评是它使程序过度冗长,然而这些批评经常针对的不是静态类型的思想而是不太灵活的类型系统实现。通过类型推断和模式匹配等一些新的编程组织方法获得的灵活性将一些绊脚石搬掉后静态类型系统的经典优越性就体现的更为明显,其中重要的包括:抽象的可检验的属性,安全的重构,以及更好的文档,还有编程工具更好的提示和支持。
- 既然这种类型系统只能发现简单错误,而单元测试能提供更广泛的覆盖,又为何自寻烦恼呢?我们认为这种论调不对头。尽管静态类型系统确实不能替代单元测试,但是却能减少用来照顾那些确需测试的属性的单元测试的数量。同样,单元测试也不能替代静态类型。总而言之,如Edsger Dijkstra 所说,测试只能证明存在错误,而非不存在。 因此,静态类型能给的保证或许很简单,但它们是无论多少测试都不能给的真正的保证。
- 集成开发环境可以通过判定选中表达式的静态类型,找到类型的所有成员,并全部显示出来。
- scala 要用圆括号访问数组因为数组也是一个类的实例访问元素只是一个方法调用,与java 相比scala 鲜有特例 scala 对任何事都追求概念的简洁性,从数组到表达式,包括带方法的对象。你不必记住太多特例。
- scala 的设计受许多编程语言和研究思想的影响。大多数都已经被以另外的形式用在其他语言中了。Scala 的革新主要来源于它是如何构造并放在一起的。Scala采用了Java和C#语法的大部分,它的统一对象模型是由Smalltalk发起的,之后又被Ruby发扬光大他的通用嵌套的思想(几乎所有的 Scala 里的构造都能被嵌套进其他构造)也出现在 Algol,Simula,和最近的 Beta 与 gbeta 中。它的方法调用和字段选择的统一访问原则来自于 Eiffel。它函数式编程的处理方式在骨子里与以 SML,OCaml 和 F#为代表的 ML 家族语言很接近。许多 Scala 标准库里面的高阶函数同样也出现在 ML 或 Haskell中。Scala 的隐式参数灵感激发自 Haskell 的类型类;它们用一种更经典的面向对象设定获得了类似的结果。Scala 的基于行动类的并发库几乎全是Erlang 的思想。 Scala不是第一个强调伸展性和扩展性的语言把前缀的操作符视为函数的特别的思想可以被回溯到Iswim和SmalltalkScala 也不是第一个集成函数式和面向对象编程的其他在OOP 里集成了函数式编程的一些元素的包括Ruby,Smalltalk和Python。Scala同样也对编程语言领域贡献了一些革新。举例来说,它的抽象类型提供了对泛型类型来说更面向对象的替代,它的特质允许灵活的控件组合,还有他的拆分器提供了独立于表达的方式去做模式匹配。
- scala 中的匿名函数相当于java 中的 FunctionN 类有几个参数这个N就等于几,然后对这个函数的调用相当于对这个对象的静态方法 apply 的调用 f(a,b) 相当于 f.apply(a,b) f是一个object
- 数组提供 new Array[Type](length);和Array[Type](a,b,c...); 相当于Array.apply[Type](a,b,c...); apply[Type]()可省略为apply() 两种构造方法,注意数组未提供 new Array[Type](a,b,c...)的构造方法,但是List只提供了 List[Type](a,b,c...)的构造方法原因是:List是抽象类没有new方法,List不可变如果提供了 new Array[Type](length);创建后面无法添加数据。
- 应该注意到令人困惑的地方是当你去掉方法体前面的等号时,它的结果类型将注定是Unit。不论方法体里面包含什么都不例外,因为Scala编译器可以把任何类型转换为Unit。因此,如果你 Unit 的值,却忘记了等号时,那么困惑就出现了。所以为了得到你想要的结果,你需要插入等号:
- scala 的分号推断规则:分割语句的精确规则非常有效却出人意料的简单。那就是,除非以下情况的一种成立,否则行尾被认为是一个分号:
- 疑问行由一个不能合法作为语句结尾的字结束,如句点或中缀操作符。
- 下一行开始于不能作为语句开始的字。
- 行结束于括号(...)或方框[...]内部,因为这些符号不可能容纳多个语句。
- Scala 比 Java更面向对象的一个方面是Scala没有静态成员。替代品是,Scala 有单例对象:singleton object。除了用object关键字替换了class 关键字以外,单例对象的定义看上去就像是类定义。
转载于:https://www.cnblogs.com/scala/archive/2011/06/09/2076721.html