Scala语法

这是一篇老的文章:scala syntax primer,从Java语法角度来看Scala语法,非常方便Java程序员转变到Scala上。

基础部分:

1. Scala的类名称无需象Java那样要与文件名一致,可以将任何Scala类放入任何Scala文件中。

2. 分号是可选,不一定象Java那样每行一个分号结束,如果需要将多个statements放在一行,需要用分号分离。

3.每个值都是对象,没有Java的原始类型,既然都是对象,都可以调用其中方法,如123是个值数字,在Java中是int类型,但是Scala中可以123.toString()。

4.Scala有显著的转换Mixin,你可以调用原来类中不存在的方法。

5.Scala遵循统一访问原则:"Uniform Access Principle" 意味着变量和无参数的函数都是以同样方式访问,只要用def替代val 或var即可(后者是变量的两种类型。)

6. Scala能够直接支持XML. 将scala.xml.Elem 分配给变量val x:
val x = <head><title>The Title</title></head>

也可以混合使用:
val title = "The Title"
val x = <head><title>{ title }</title></head>


Keywords关键词修饰语法部分:

1.没有Java的static关键词. 在Scala中使用Object来替代static,Object是单态的。

2.Scala没有break 或 continue. 通过函数编程风格来降低这种要求(banq注:也许Scala难点所在)。

3.Access modifiers such as protected and private can include a scope in square brackets, such as private[this] or protected[MyPackage1.MyPackage2]. The default access is public.

4. val 是用于不可变变量,相当于Java中增加了final,而var是可变变量

5.一个import可以导入多个:
import java.text.{DateFormat,SimpleDateFormat}

6. 导入符合可以改名:
import java.util.{Date=>UDate}
import java.sql.{Date=>SDate}

7. 如果导入改名为_, 除了规定的符号,其他都什么不导入:
import java.util.{Date=>_,_}

8. abstract 只用于抽象class和 traits. 对于函数 val或var的抽象表达方式,你只需要忽略=后面的body部分即表示他们是抽象的

9.当需要覆盖超级类中一个方法时,覆盖的修改器必须指定,如果没有指定,将不会覆盖。

10.新的修饰语: lazy, implicit

[该贴被banq于2012-04-22 10:22修改过]

1.Scala允许使用三个引号来进行多行字符引用:


val longString = """Line 1
Line 2
Line 3
""";

2.字符变量可以包含任何字符,包括 *, +, ~ 和 :等,但\是一个受保护的符号,比如"abc\"def"表示是7个字符。

3.下划线_是一个通配符,不是通常的*星号,后者也是Scala中受保护的符号。

4.和Java一样,类名第一个字符要大写,变量名第一个字符小写。

5.在case 语法中,开头第一个字符的大小写是关系到编译结果的,用来区别常量。


What parts of the Java ecosystem and language should a developer learn to get the most out of Scala? 列举了Java和Scala的区别:


•Java 可变集合概念 vs. Scala 可变/不可变定义
•Java静态方法 vs. Scala单例对象singleton objects (Scala)
•循环for loops
•Java return statement vs. Scala functional style ("每个表达式都返回一个值every expression returns a value")
•Java使用null表示没有值"no value" vs. Scala更加显式的Option类型
•imports 导入包
•Java的switch语法 vs. Scala match语法

在下面这些方面,Scala还在使用Java标准库:
•IO
•GUI (Scala has a wrapper for Swing, but hey)
•URLs, URIs, files
•date
•timers

Scala有一些Java中找不到的对应库包:
•operator overloading
•implicits and implicit conversions
•multiple argument lists / currying
•anonymous functions / functions as values
•actors
•streams
•Scala pattern matching (which rocks)
•traits
•type inference
•for comprehensions
•awesome collection operations like fold or map