2012-05-07 13 views
1

Scalaの基本的な概念を頭に入れようとしています。したがって、Classがnewというキーワードでインスタンス化されるたびに、新しいオブジェクトが取得されます。 objectキーワードで宣言されたシングルトンオブジェクトは、 'new'というキーワードでインスタンス化することはできません。ある意味では、コンパイル時にインスタンス化されます。Scalaクラス、オブジェクト、ケースクラス、リテラル

4はIntのケースクラスですか? 5.07はDoubleのケースクラスですか?

4はオブジェクトですか?

クラスそのものは、時にはオブジェクトか、常にオブジェクトですか?

関数はオブジェクトです。彼らはクラスのインスタンスですか?これはどういったものですか?

Scalaは純粋にオブジェクト指向のスモールトークとして扱われているのですか、OOフロントでいくつかの妥協をしましたか?

+0

Scala.NothingはIntとDoubleのサブクラスですが、 –

+0

クラスはScalaのオブジェクト(=メタクラスのインスタンス)ではありません。実際、彼らは価値観ではありません。 – Debilski

答えて

9

new演算子を使用してクラスをインスタンス化すると、そのクラスの新しいインスタンスが取得されます。新しいインスタンスはオブジェクトです。

objectキーワードを使用してシングルトンオブジェクトを宣言できます。コンパイル時にインスタンス化されているとは、実際に何も意味しません。オブジェクトは、プログラムが実行されている間だけ存在し、その時間より前ではありません(プログラムのコンパイル時など)。 objectは、初めて使用されたときにインスタンス化されます。

4はIntのケースクラスですか? 5.07はDoubleのケースクラスですか?

番号4および5.07は、クラスIntおよびDoubleのインスタンスにすぎません。 Scalaでは、オブジェクトと同じように動作しますが、シーン4および5.07の背後には実際にオブジェクトがありません。これを理解するには、標準のScalaクラス階層について知っておく必要があります。

階層の最上部にタイプAnyがあります。すべてがAnyに拡張されます。 Anyは、2つの直接サブタイプ:AnyValおよびAnyRefを有する。

  • AnyValは、すべての値タイプのスーパータイプです。値タイプは、JVMプリミティブタイプにマップするタイプです(たとえば、Int - >intDouble - >doubleなど)。
  • AnyRefは、すべての参照型(「通常の」オブジェクト)のスーパータイプです。

AnyRefを拡張するものはすべて舞台裏のオブジェクトであり、AnyValを拡張するものはすべて実際にオブジェクトではありません。プリミティブ型にマップされます。

ケースクラスは単なる構文上の砂糖の一種です。ケースクラスは通常のクラスとまったく同じですが、コンパイラがいくつかのメソッドを自動的に追加する点が異なります(パターンマッチングに適しています)。

3

4と5.07はオブジェクトではありません。それらは、IntDoubleクラスのインスタンスです。階層hereを参照してください。

オブジェクトはコンパイル時にインスタンス化されません。オブジェクトにアクセスすると、オブジェクト本体/コンストラクタの実行の意味でインスタンス化されます。

関数もオブジェクトではなく、FunctionN(たとえば)を拡張する匿名クラスのインスタンスです。しかし、はい、それはあなたが書くことができるようにいくつかの一般的なユーティリティのものを提供し、objectがあります:

//instance of Function2 
scala> val sum = (x: Int, y: Int) => x+y 
sum: (Int, Int) => Int = <function2> 

scala> sum.curried 
res0: Int => (Int => Int) = <function1> 

// now back to uncurried version with Function object 
scala> Function.uncurried(res0) 
res1: (Int, Int) => Int = <function2> 

場合、プレーンクラスとケースクラスを見てhereの違いに興味を持って。

残念ながら、私はsmalltalkと比較して、scala oopの純度を前提にしてsmalltalkを知らない。

関連する問題