《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)。类和它的伴生对象å¯ä»¥äº’ç›¸è®¿é—®å…¶ç§æœ‰æˆå‘˜ã€‚