2016-11-24 37 views
0

Scalaコードをチェックする際に次のコードが発生しました。私はそれが何をするのかを理解することが難しいと思っています。スカラ追加クラスをクラスに追加

class Foo(val name: String, val age: Int, val sex: Symbol) 

object Foo { 
    def apply(name: String, age: Int, sex: Symbol) = new Foo(name, age, sex) 
} 

すでに定義されているクラスFooにコンストラクタメソッドを追加しますか?

この構文を使用して既に定義されているクラスに追加のメソッドを追加することはできますか?

+1

あなたはコンパニオンオブジェクトについて読む必要があります。http://docs.scala-lang。 org/tutorials/tour/singleton-objects.htmlこれが役立つことを望みます。 – Pavel

+1

私はあなたに非常に正直な意見を与えます。このコードを理解できない場合は、Scalaの基本をすべてのソースから読み込もうとはしていません。だから...私はちょうどstackoverflowのようなコミュニティに尋ねる前に、いくつかの努力をするように要求します。 –

答えて

2

場合、あなたは静的メソッドとして)(Foo.applyと考えることができます:

は私に複製などのように見えます。

現実的に、Scalaのオブジェクトはシングルトンインスタンスとして実装されています。

Here's the documentation on that.

+0

私は別のファイルでFooを参照しているとき、私はシングルトンオブジェクトまたはクラスを参照していますか?結局のところコンパニオンオブジェクトがあるのはなぜですか?なぜクラス定義に同じメソッドを定義しないのですか? –

+0

この場合、静的コンストラクタの一種としてapply()メソッドを使用しています。ただし、この場合は、代わりにケースクラスを使用する方が実際には良いかもしれません。 apply()でよりうまく動作する – Himself12794

+0

Companionオブジェクトは、シングルトンパターンを実装するためのスケーラの方法であり、他の言語よりもはるかに優れています。 C#で言う。 – Pavel

2

それはapplyメソッドを持っている場合は、Scalaで任意のクラスまたはオブジェクトのインスタンスを起動することができます。ここでは、Fooのコンパニオンオブジェクトにコンストラクタメソッドを追加して、それを呼び出すとFoo.のインスタンスを生成します。

このメソッドを使用してインスタンスにメソッドを追加することはできません。そのためには、implicitsを使用して実装されたScala Pimp My Libraryパターンに興味があるかもしれません。

// the following are equivalent, given your code above 

val x = new Foo("Jason", 29, 'Male) 
val y = Foo.apply("Jason", 29, 'Male) 
val z = Foo("Jason", 29, 'Male) 
+0

コンストラクタをコンパニオンオブジェクトに追加し、クラス自体に追加することの違いは何ですか? –

+0

Scalaには静的メソッドがありません。クラスに追加した場合は、すでにインスタンスがある場合にのみ呼び出すことができます。このため、コンパニオンオブジェクトを使用してファクトリメソッドを格納します。 – longshorej

+0

だから、あなたのコードの後に​​val a = Foo( "Jack"、30、 "Male")と呼んだ場合、どうなりますか?新しいオブジェクトが作成されますか?または、Fooの既存のオブジェクトの値が変更されますか? –

3

それはすでに を定義したFooクラスにコンストラクタメソッドを追加していますか?

これは、クラスに構文糖を追加します。

val foo = Foo() 

代わりの

val foo = new Foo() 

すでにこの構文を使用して定義 あるクラスに余分なメソッドを追加することが可能です:意味は、次のようなFooのインスタンスを作成することができますか?その点で

コンパイラはそれを知っているとFoo.applyFoo()を拡大するよう、applyは特別です。つまり、呼び出す方法が他にもある場合は、Foo静的オブジェクトを呼び出す必要がありますが、Fooインスタンスには適用されません。

あなたが外部Fooにメソッドを追加したい場合は、暗黙のクラスを経由して行うことができます。

val f = Foo() 
println(f.fooDetails()) 
1

implicit class RichFoo(foo: Foo) extends AnyVal { 
    def fooDetails(): String = s"{Name: ${foo.name}, Age: ${foo.Age}" 
} 

は今、あなたはFooのインスタンスでそれを呼び出すことができますこのパターンは一般にstatic factory methodsとして知られています。あなたが提供されているコードは、非常に有用ではありませんが、これらの追加のファクトリメソッドを(「という名前のコンストラクタ」と考える)考えてみます。

class Foo(val name: String, val age: Int, val sex: Symbol) 

object Foo { 
    def apply(name: String, age: Int, sex: Symbol) = new Foo(name, age, sex) 
    def newMaleFoo(name:String,age:int) = new Foo(name,age,'male) 
    def newPeterFoo(age:int) = new Foo("Peter",age,'male) 
} 
関連する問題