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;
}
}
您无法更改这些值,因为它们被定义为 val
。 val
定义了固定值(不可修改)。
您可以做的是将接收到的值定义为私有值,并定义其他值,递增:
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 未声明时实例化时执行。
其次,如果这在一般意义上是可能的,那将导致代码难以理解。
第三,不清楚你是想改变 x
和 y
还是只是 return 一个新值。
第四,如果是后者,会导致死循环,代码永远写不完。
第五,为什么不只是这样呢?
final case class SomeClass(x: Int, y: Int)
object SomeClass {
def apply(x: Int, y: Int): SomeClass =
new SomeClass(x + 1, y + 1)
}
例如,我有一个这样的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;
}
}
您无法更改这些值,因为它们被定义为 val
。 val
定义了固定值(不可修改)。
您可以做的是将接收到的值定义为私有值,并定义其他值,递增:
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 未声明时实例化时执行。
其次,如果这在一般意义上是可能的,那将导致代码难以理解。
第三,不清楚你是想改变 x
和 y
还是只是 return 一个新值。
第四,如果是后者,会导致死循环,代码永远写不完。
第五,为什么不只是这样呢?
final case class SomeClass(x: Int, y: Int)
object SomeClass {
def apply(x: Int, y: Int): SomeClass =
new SomeClass(x + 1, y + 1)
}