1

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

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

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

クラス自体は時々、または常にオブジェクトですか?

関数はオブジェクトです。それらはクラスのインスタンスでもありますか?これはどのように組み合わされますか?

ScalaはSmalltalkのように純粋にオブジェクト指向ですか、それともオブジェクト指向の面で妥協しましたか?

4

2 に答える 2

9

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

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

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

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

階層の最上位は typeAnyです。すべてが伸びAnyます。Anyには、 と の 2 つの直接サブタイプがAnyValありAnyRefます。

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

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

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

于 2012-05-07T13:07:39.420 に答える
3

4 と 5.07 はオブジェクトではありません。これらは、IntおよびDoubleクラスの単なるインスタンスです。ここで階層を見てください。

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

関数もオブジェクトではなく、 FunctionN を拡張する無名クラスのインスタンスです (例: Function2 )。しかし、はい、いくつかの一般的なユーティリティを提供する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>

プレーン クラスとケース クラスの違いに興味がある場合は、こちらをご覧ください。

残念ながら、smalltalk と比較して、scala oop の純度を仮定する smalltalk については知りません。

于 2012-05-07T12:47:39.990 に答える