在前面章節裡,我們了解了 class ,object的差別,簡單回顧下
calss 靜态模闆(了解成傳統的class就可以)
object 單例類,對object做點補充
1. 既然是單例,就不能被new,如object名為SharkObj不能寫成
1
2
<code>//var so = new SharkObj //error</code>
<code>var</code> <code>so </code><code>=</code> <code>SharkObj </code><code>//正确</code>
2. 可以直接寫類名調用方法,假設SharkObj有方法m(x:Int)
<code>SharkObj.m(</code><code>1</code><code>)</code>
那case classes 又是做什麼的呢? 你可以就把他了解成一個普通的class,但是又略有不同,總結如下:
不需要寫 new, 但是可以寫
預設是public ,在任何地方調用
預設實作了toString
不能被繼承
對case calss的質疑聲音比較高,感覺價值不大。官方原文:
It makes only sense to define case classes if pattern matching is used to decompose data structures.
當然,隻有在pattern matching下有意義這話未免有所偏激,至少部分老程式員會有其他意見:
get auto-generated equals, hashCode, toString, static apply() for shorter initialization, etc.
這裡簡單表示下,了解為 match case的控制語句
下面把官方例子貼給大家:
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<code>abstract</code> <code>class</code> <code>Term</code>
<code>case</code> <code>class</code> <code>Var(name</code><code>:</code> <code>String) </code><code>extends</code> <code>Term</code>
<code>case</code> <code>class</code> <code>Var</code><code>1</code> <code>extends</code> <code>Term</code>
<code>case</code> <code>class</code> <code>Fun(arg</code><code>:</code> <code>String, body</code><code>:</code> <code>Term) </code><code>extends</code> <code>Term</code>
<code>case</code> <code>class</code> <code>App(f</code><code>:</code> <code>Term, v</code><code>:</code> <code>Term) </code><code>extends</code> <code>Term</code>
<code>object</code> <code>TermTest </code><code>extends</code> <code>scala.App {</code>
<code> </code><code>def</code> <code>printTerm(term</code><code>:</code> <code>Term) {</code>
<code> </code><code>term </code><code>match</code> <code>{</code>
<code> </code><code>case</code> <code>Var(n) </code><code>=</code><code>></code>
<code> </code><code>print(n)</code>
<code> </code><code>case</code> <code>Fun(x</code><code>1</code><code>, b) </code><code>=</code><code>></code>
<code> </code><code>print(</code><code>"^"</code> <code>+ x</code><code>1</code> <code>+ </code><code>"."</code><code>)</code>
<code> </code><code>printTerm(b)</code>
<code> </code><code>case</code> <code>App(f, v) </code><code>=</code><code>></code>
<code> </code><code>print(</code><code>"("</code><code>)</code>
<code> </code><code>printTerm(f)</code>
<code> </code><code>print(</code><code>" "</code><code>)</code>
<code> </code><code>printTerm(v)</code>
<code> </code><code>print(</code><code>")"</code><code>)</code>
<code> </code><code>}</code>
<code> </code><code>}</code>
<code> </code><code>def</code> <code>isIdentityFun(term</code><code>:</code> <code>Term)</code><code>:</code> <code>Boolean </code><code>=</code> <code>term </code><code>match</code> <code>{</code>
<code> </code><code>case</code> <code>Fun(x, Var(y)) </code><code>if</code> <code>x </code><code>==</code> <code>y </code><code>=</code><code>> </code><code>true</code>
<code> </code><code>case</code> <code>_</code> <code>=</code><code>> </code><code>false</code>
<code> </code><code>val</code> <code>id </code><code>=</code> <code>Fun(</code><code>"x"</code><code>, Var(</code><code>"x"</code><code>))</code>
<code> </code><code>val</code> <code>t </code><code>=</code> <code>Fun(</code><code>"x"</code><code>, Fun(</code><code>"y"</code><code>, App(Var(</code><code>"x"</code><code>), Var(</code><code>"y"</code><code>))))</code>
<code> </code><code>printTerm(t)</code>
<code> </code><code>println</code>
<code> </code><code>println(isIdentityFun(id))</code>
<code> </code><code>println(isIdentityFun(t))</code>
<code> </code><code>println(</code><code>new</code> <code>Var</code><code>1</code><code>==</code><code>new</code> <code>Var</code><code>1</code><code>);</code>
<code> </code><code>println(</code><code>new</code> <code>Var(</code><code>""</code><code>)</code><code>==</code><code>new</code> <code>Var(</code><code>"1"</code><code>));</code>
<code>}</code>
本文轉自 wws5201985 51CTO部落格,原文連結:http://blog.51cto.com/yjplxq/1415533,如需轉載請自行聯系原作者