与属性同名的构造方法参数

时间:2013-05-07 04:17:09

标签: scala

在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)
}

2 个答案:

答案 0 :(得分:6)

在Scala中,如果声明为varval,构造函数的参数将成为类的公共属性。

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)生成 object-private 字段,这些字段仅允许Point类的方法访问字段xy Point类型的其他对象。 that方法中的+是另一个对象,不允许使用此定义进行访问。要查看此操作,请定义添加方法def xy:Int = x + y,该方法不会生成编译错误。

要让班级可以访问xy,请使用 class-private 字段,如下所示:

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来查看此操作。

答案 1 :(得分:0)

你不需要;在Scala中你需要的是类声明中的“参数”。