0

Javaでは、これを行うことができます:

class Point{
  int x, y;
  public Point (int x, int y){
    this.x = x;
    this.y = y;
  }
}

Scala で同じことを行うにはどうすればよいですか (コンストラクターの引数とクラス属性で同じ名前を使用します)。

class Point(x: Int, y: Int){
  //Wrong code
  def x = x;
  def y = y;
}

編集

以下のコードが機能しないため、これを求めています

class Point(x: Int, y: Int) {
    def +(that: Point): Point = new Point(this.x + that.x, this.y + that.y)
}

しかし、次のものは機能します:

class Point(px: Int, py: Int) {
  def x = px
  def y = py
  def +(that: Point): Point = new Point(this.x + that.x, this.y + that.y)
}
4

2 に答える 2

6

Scala では、コンストラクターのパラメーターは、varまたはとして宣言されている場合、クラスのパブリック属性になりますval

scala> class Point(val x: Int, val y: Int){}
defined class Point

scala> val point = new Point(1,1)
point: Point = Point@1bd53074

scala> point.x
res0: Int = 1

scala> point.y
res1: Int = 1

コメントで質問に答えるように編集してください。

コンストラクターは、クラスのメソッドのみがフィールドにアクセスできるようにするオブジェクト プライベートフィールドをclass Point(x: Int, y: Int)生成し、 type の他のオブジェクトにはアクセスできません。メソッド内のオブジェクトは別のオブジェクトであり、この定義ではアクセスできません。これを実際に確認するには、コンパイル エラーを生成しないメソッドを定義して追加します。PointxyPointthat+def xy:Int = x + y

クラスにアクセスできるようにするには、次のようなクラス プライベート フィールドを使用xますy

class Point(private val x: Int, private val y: Int) {
    def +(that: Point): Point = new Point(this.x + that.x, this.y + that.y)
}

クラス外からはアクセスできなくなりました。

scala> val point = new Point(1,1)
point: Point = Point@43ba9cea

scala> point.x
<console>:10: error: value x in class Point cannot be accessed in Point
              point.x
                    ^
scala> point.y
<console>:10: error: value y in class Point cannot be accessed in Point
              point.y

を使用して、これを実際に確認できますscalac -Xprint:parser Point.scala

于 2013-05-07T04:22:33.723 に答える
0

その必要はありません。クラス宣言の「引数」は、Scala で必要なすべてです。

于 2013-05-07T04:18:34.990 に答える