RSS

Scala 初学乍练

11 Jul

《Programming in Scala》确实不是本新书,而且它700+页的厚度也挺吓人,但对以初学一门语言为目的的我来说,它的思路和讲解却已足够清楚。这本书或许不能痛快地直奔scala核心思想,但从语言层面开始学习和实践的角度,有了它确实挺好。

类型推断
    è®°å¾—java中一次一次地写对象引用的类型声明吗?对象自实例化之初就明确了它自己的类型,为什么还非要指定其引用的类型呢?即便是如Fruit fruit = new Apple();使用抽象类型或接口,在更新语言看来也是多此一举。如C#3.0起引入var作为为引用声明的类型的placeholder,为编译服务,var fruit = new Apple(); Scala自然也看这种类型显示指定不顺眼,于是直接省略掉,辅助以类型推断来理解省略的类型信息, val fruit = new Apple. val为不可变变量的标志。

val 、var声明
    val array = Array(1,2,3)  中,array这个引用不能改为引用其他对象,而Array对象本身可更改。
    for(param <- params)  …  句中,param是val的,即不能通过此for循环直接遍历params数组并逐一改变元素值。

operator
    æ²¡æœ‰operator,所有如+,-,*,/的操作都是方法,1+2 实际上是 (1).+(2),即1上调用+方法且参数为2
    è§„则:如果一个方法被用作操作符标注,如 a * b,那么方法被左操作数调用,就像 a.*(b)——除非方法名以冒号结尾。这种情况下,方法被右操作数 调用。因此,1 :: twoThree里,::方法被twoThree调用,ä¼ å…¥1,像这样:twoThree.::(1)。

tuple 现代怪胎
    ä½¿ç”¨ï¼ˆelement1,element2,….)的方式创建的不可变多元组,元素类型不统一,使用诡异tupleObject._N方式访问各元素,其中N从1开始而非起自0的典型方式。源自Haskellå’ŒML语言从1开始计索引的现代怪胎。

绕人的mutable和immutable
    å…ˆä¸è¦æç‰¹è´¨ï¼ˆtrait)了,只看immutable.Set å’Œ mutable.Set到底差多少?前者的元素内容不可被更改,后者可以,且其set对象是可扩充的。以含有 += 操作的如下代码为例
————————————————————————————————————————————————–
    var immutableSet = Set(1, 2)    // 不特别import的情况下,scala.collection.immutable.Set是默认Set类型
    val mutableSet = scala.collection.mutable.Set(a, b)

    immutableSet += 3                    // 等同于 immutableSet = immutableSet + 3
    mutableSet += c                        // 调用mutable Set的方法,等同于mutableSet.+=(3)
                                                    // 因为是val声明,所以保证mutableSet仍是原对象

    immutableSet.foreach(print)     // 输出:123
    mutableSet.foreach(print)         // 输出:abc
————————————————————————————————————————————————–

函数式编程方式
    æŒ‡ä»¤å¼çš„编程方式也是scala语法的一部分,但却常常闻不到scala的美味。
    å“²å­¦
        æŠŠæ¯ä¸ªæ–¹æ³•当作是创建返回值的表达式。鼓励你分解大的方法,制造多个小方法。
    è®¾è®¡/重构的目标
        ä½¿ç”¨val而非var
        ä½¿ç”¨immutable对象
        ç¼–写易于测试的且职责单一的方法
    ç¨‹åºé£Žæ ¼
        æ–¹æ³•最后一个表达式的计算结果即是返回值,显示调用return是备用方案
        å•行方法体合并到方法声明同一行
        ç”¨è¿‡ç¨‹ï¼ˆprocedure)风格编写无结果类型(Unit型)的方法
        [编译原因] 中缀操作符放在行尾而不是行首,如拼接字符串时,放在行首是单独的语句

伴生对象(companion object)
    val list = List(1,2,3)        ==>    val list = List.apply(1,2,3)    其中apply方法是List的伴生对象的方法,而非java中的static方法。scala没有静态成员。
    å½“单例对象与某个类共享同一个名称时,他被称作是这个类的伴生对象(companion object)。你必须在同一个源文件里定义类和它的伴生对象。类被称为是这个单例对象的伴生类(companion class)。类和它的伴生对象可以互相访问其私有成员。

 

About Wu Shaobo

@ThoughtWorks
Comments Off on Scala 初学乍练

Posted by in Uncategorized

 

Comments are closed.