Scala:如何在声明 class 时自动调用方法?

Scala: How to automaticly call method when class is declared?

例如,我有一个这样的class:

class SomeClass(val x:Int, val y: Int) {
 def someMethod(a: Int = x, b: Int = y) = new SomeClass(x + 1, y + 1)
 override def toString = x + " " + y
}

并且我希望在声明 class 时调用 someMethod。并且 someMethod 应该更改值 x 和 y。

所以当我执行代码时:

val sc = new SomeClass(2, 5)
print(sc)

我希望得到这样的结果:

3 6

你能帮我解决这个问题吗?

这是我需要的,但在 C# 中:

using System;
                    
public class Program
{
    public static void Main()
    {
        SomeClass sc = new SomeClass(2,5);
        Console.WriteLine(sc);
    }
}
public class SomeClass
{
    int x, y;
    public SomeClass(int x, int y) 
    {
        this.x = someMethod(x);
        this.y = someMethod(y);
    }
    int someMethod(int z)
    {
        return z + 1;
    }
    public override string ToString() 
    {
        return x + " " + y;
    }
}

您无法更改这些值,因为它们被定义为 valval定义了固定值(不可修改)。

您可以做的是将接收到的值定义为私有值,并定义其他值,递增:

class SomeClass(private val xInternal:Int, private val yInternal: Int) {
  val x = xInternal + 1
  val y = yInternal + 1
  def someMethod(a: Int = x, b: Int = y) = new SomeClass(x + 1, y + 1)
  override def toString = s"$x $y"
}

val sc = new SomeClass(2, 5)

代码 运行 在 Scastie

首先,您希望它在 class 未声明时实例化时执行。

其次,如果这在一般意义上是可能的,那将导致代码难以理解。

第三,不清楚你是想改变 xy 还是只是 return 一个新值。

第四,如果是后者,会导致死循环,代码永远写不完。

第五,为什么不只是这样呢?

final case class SomeClass(x: Int, y: Int)

object SomeClass {
  def apply(x: Int, y: Int): SomeClass =
    new SomeClass(x + 1, y + 1)
}