在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)
}
答案 0 :(得分: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)
生成 object-private 字段,这些字段仅允许Point
类的方法访问字段x
和y
Point
类型的其他对象。 that
方法中的+
是另一个对象,不允许使用此定义进行访问。要查看此操作,请定义添加方法def xy:Int = x + y
,该方法不会生成编译错误。
要让班级可以访问x
和y
,请使用 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中你需要的是类声明中的“参数”。