在前面章节里,我们了解了 class ,object的区别,简单回顾下
calss 静态模板(理解成传统的class就可以)
object 单例类,对object做点补充
1. 既然是单例,就不能被new,如object名为SharkObj不能写成
1
2
|
//var so = new SharkObj //error
var
so
=
SharkObj
//正确
|
2. 可以直接写类名调用方法,假设SharkObj有方法m(x:Int)
1
|
SharkObj.m(
1
)
|
那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的控制语句
下面把官方例子贴给大家:
1
2
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
|
abstract
class
Term
case
class
Var(name
:
String)
extends
Term
case
class
Var
1
extends
Term
case
class
Fun(arg
:
String, body
:
Term)
extends
Term
case
class
App(f
:
Term, v
:
Term)
extends
Term
object
TermTest
extends
scala.App {
def
printTerm(term
:
Term) {
term
match
{
case
Var(n)
=
>
print(n)
case
Fun(x
1
, b)
=
>
print(
"^"
+ x
1
+
"."
)
printTerm(b)
case
App(f, v)
=
>
print(
"("
)
printTerm(f)
print(
" "
)
printTerm(v)
print(
")"
)
}
}
def
isIdentityFun(term
:
Term)
:
Boolean
=
term
match
{
case
Fun(x, Var(y))
if
x
==
y
=
>
true
case
_
=
>
false
}
val
id
=
Fun(
"x"
, Var(
"x"
))
val
t
=
Fun(
"x"
, Fun(
"y"
, App(Var(
"x"
), Var(
"y"
))))
printTerm(t)
println
println(isIdentityFun(id))
println(isIdentityFun(t))
println(
new
Var
1
==
new
Var
1
);
println(
new
Var(
""
)
==
new
Var(
"1"
));
}
|
本文转自 wws5201985 51CTO博客,原文链接:http://blog.51cto.com/yjplxq/1415533,如需转载请自行联系原作者