天天看點

【scala初學】class , object ,case classes

在前面章節裡,我們了解了 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>&gt;</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>&gt;</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>&gt;</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>&gt; </code><code>true</code>

<code>    </code><code>case</code> <code>_</code> <code>=</code><code>&gt; </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,如需轉載請自行聯系原作者

繼續閱讀