1. Scala面向对象与函数编程(函数是一级的first class;函数输入输出映射,数据immutable不可修改)结合,兼容、简洁、高级抽象、静态类型(类型推断使Scala具有动态语言的赋值形式,但Scala变量保存、赋值,编译特征决定它是静态语言)、灵活。
2. 函数式编程风格,尽量尝试不使用任何var变量,使用val变量编程。
3. java里需要写public的地方,Scala可以不写,public是Scala的默认访问级别。
4. Scala方法参数的一个重要特征:参数都是val,不是var。
5. Scala方法定义可以不写返回类型,但如果是递归方法必须要指明该方法返回类型。
6. Scala不能定义静态成员,取而代之的是定义单例对象(singleton object),用object 关键字定义的单例对象与某个类共享同一名称时,被称为该类的伴生对象(companion object),类和它的半生对象必须定义在一个源文件里。该类被称为此单例对象的伴生类(companion class)。类和它的伴生对象可以互相访问其private成员。
7. Scala每个源文件默认隐含了对包java.lang、包Scala,以及单例对象predef的成员引用。
8. Scala对源文件的命名没有硬性要求,与java不同,推荐像java那样按照所包含的类名来命名文件。
9. 以.scala为后缀的文件,如果不是源文件,而是解释器执行的脚本,则必须以结果表达式结束文件。
10. Scala编译器将会把类内部的任何既不是字段也不是方法定义的代码编译到主构造器当中。
11. Scala字段、方法参数、本地变量,以及函数的驼峰式名称,通常约定以小写字母开始,比如:s,length,flatMap等。类和特质的驼峰式名称,以大写字母开始,比如:BigInt,List,UnbalancedTreeMap。下划线在Scala中有其他非标识符用法,因此,命名中尽量不使用下划线,例如避免to_string,_int_,name_等命名。
12. Scala类定义中的每个辅助构造器都是以 ”def this(...)“ 形式开头,其方法主体的第一个动作是,调用主构造器或早于该构造器定义的其他辅助构造器。规则的根本结果是每个Scala的构造器调用最终结束于对主构造器的调用,因此,主构造器是类的唯一入口点。
13. Scala的if语句可以是能够直接返回值的表达式。
14. Scala方法的声明,如果没有参数时,可以省略方法名称后面的括号 ();可以省略声明定义中的方法返回类型,根据方法主体类型推断;如果方法主体只有一个语句,主体前面有等号 =,则可以省略方法主体的花括号 {};如果省略了类型和等号(等号一般不能单独省略),该方法默认为Unit类型,表明存在且唯一存在类型为Unit的值,称为unit value,写成(),这是Scala的Unit不同于java的void的地方之一。
15. while( (var line = readline()) != " " )语句,不同于java的赋值语句可以返回被赋予的那个值,在Scala中 var line = readline(),对var类型变量赋值,等式本身返回unit值,while循环条件判断永远不会为假,循环将永远不会结束。
16. 由于while循环不产生值,经常被函数式语言放弃使用,函数式语言采用递归实现循环,代码可读性上要弱一点。(应该也是见仁见智,因为Scala编译器对所有在尾调用(tail-call)位置的递归调用,编译器会产生出与while循环类似的代码,也许是需要用函数字面量时,可能使用递归函数多一些)
17. 如果在发生器中加入超过一个过滤器,if过滤字句必须用分号分隔。(page 78)
18. Scala控制结构有if-else,while,for,match(相当于java的switch),没有了break和continue。控制结构与指令式控制结构功能接近,又因为Scala控制结构能够产生值,支持函数式风格,为Scala的重要特征函之一函数字面量做了铺垫。
19. 在方法的嵌套作用域范围中,与java不同,Scala支持在内部范围定义与外部范围相同名字的变量,内部变量被编译器认为shadow遮蔽了同名的外部变量。在解释器中,也是如此,可以随意重用val或var等类型的相同变量名,概念上,解释器为每次输入的新语句都创建了新的作用域嵌套范围。(page86)
20. for( arg -> args ), ->表示”其中“,arg变量默认是 val arg,arg的值在for语句主体中不能再被赋值,每次循环将创建并初始化新的arg值,然后调用执行for的函数体。