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

var在 Scala 中,如果声明为 a或,构造函数的参数将成为类的公共属性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)生成对象私有字段,这些字段只允许Point类的方法访问字段x,而y不允许其他类型的对象Pointthat+方法中是另一个对象,并且不允许使用此定义进行访问。要查看此操作,请定义添加一个def xy:Int = x + y不会生成编译错误的方法。

要拥有xy访问该类,请使用类私有字段,如下所示:

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 回答