ではScalaの実際に普通のクラスであるケースクラスは、そこにあります。しかし、それのクラスと普通のわずかに異なるが、以下のように:
1、あなたは新しいものではない、もちろん、あなたはまた、新しい追加するために、特定の一般的なカテゴリの必要性を追加することができ、初期化時に、
scala>
case
class
Iteblog(name
:
String)
defined
class
Iteblog
scala>
val
iteblog
=
Iteblog(
"iteblog_hadoop"
)
iteblog
:
Iteblog
=
Iteblog(iteblog
_
hadoop)
scala>
val
iteblog
=
new
Iteblog(
"iteblog_hadoop"
)
iteblog
:
Iteblog
=
Iteblog(iteblog
_
hadoop)
|
2、のtoStringはより美しく達成します。
scala> iteblog
res
5
:
Iteblog
=
Iteblog(iteblog
_
hadoop)
|
3、等号とhashCodeのデフォルトの実装。
scala>
val
iteblog
2
=
Iteblog(
"iteblog_hadoop"
)
iteblog
2
:
Iteblog
=
Iteblog(iteblog
_
hadoop)
scala> iteblog
==
iteblog
2
res
6
:
Boolean
=
true
scala> iteblog.hashCode
res
7
:
Int
=
57880342
|
図4に示すように、デフォルトの直列化が実現され、シリアル化されました。
scala>
class
A
defined
class
A
scala>
import
java.io.
_
import
java.io.
_
scala>
val
bos
=
new
ByteArrayOutputStream
bos
:
java.io.ByteArrayOutputStream
=
scala>
val
oos
=
new
ObjectOutputStream(bos)
oos
:
java.io.ObjectOutputStream
=
java.io.ObjectOutputStream
@
4
c
257
aef
scala> oos.writeObject(iteblog)
scala>
val
a
=
new
A
a
:
A
=
$iwC$$iwC$A
@
71687
b
10
scala> oos.writeObject(a)
java.io.NotSerializableException
:
$iwC$$iwC$A
|
5、自動的にscala.Productからいくつかの機能を継承し、
6、パラメータケースクラスのコンストラクタは、私たちが直接アクセスすることができ、公共のレベルです。
scala> iteblog.name
res
11
:
String
=
iteblog
_
hadoop
|
図7は、パターンマッチングのためのサポート、
実際には、感情ケースクラスは、最も重要な機能のサポートパターンマッチングでなければなりません。これは、我々はケースクラスを定義する唯一の理由である、不思議Scalaの公式も言っていない:それは唯一のIFが分解しデータ構造のためのパターンマッチングに使用した場合のクラスを定義することは理にかなって。 。次の例を考えてみます。
object
TermTest
extends
scala.App {
def
printTerm(term
:
Term) {
term
match
{
case
Var(n)
=
>
print(n)
case
Fun(x, b)
=
>
print(
"^"
+ x +
"."
)
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))
}
|