Java vs Swift 中的常量类型



我看到了其他一些答案,并咨询了我的老师,但我似乎无法得到我想要的答案。在 swift 中,如果我声明一个变量,则大致如下:

var number1 = 1
var number2 = 2
let sum = number1 + number2
number1 = number1 + 1

最后一行应该反过来将总和的值增加一,假设我没记错。但是据我所知,在java中没有办法做到这一点。有谁知道办法?(底线是,我可以制作一个变量,其值流畅地依赖于其他变量吗?

如果我的问题有任何问题,请告诉我,我可以改写。

谢谢

Java 和 Swift 都不是这样工作的。 Java 中的int和 Swift 中的Int不会跟踪过去哪些其他值对其值"贡献"。

假设我没记错的话,最后一行应该反过来将总和的值增加 1。

事实上,你记错了。

在 Swift 中,之后更新let sum = a + b的一个组件不会改变sum。执行从上到下进行。

let所做的只是声明一个"常量",即一个你不能再改变的var。这就像Java中的final int

也许您希望sum成为一个函数/闭包?然后,每当您调用它时,它都会生成"当前"值。

正如其他人所说,这在 Java 和 Swift 中都是不可能的。

根据您的评论,我想出了这个简单的例子:

import java.util.function.Supplier;
public class Variable<T extends Number> {
private Supplier<T> value;
public Variable(final T value) {
this.value = () -> value;
}
public Variable(final Supplier<T> expression) {
this.value = expression;
}
public T value() {
return this.value.get();
}
public void update(T value) {
this.value = () -> value;
}
public void update(final Supplier<T> expression) {
this.value = expression;
}
}

这是您使用它的方式:

Variable<Integer> a = new Variable<>(10);
Variable<Integer> b = new Variable<>(20);
Variable<Integer> c = new Variable<>(() -> Integer.sum(a.value(), b.value()));
System.out.println(c.value()); // 30
b.update(10);
System.out.println(c.value()); // 20
b.update(() -> Integer.sum(a.value(), 100));
System.out.println(b.value()); // 110
System.out.println(c.value()); // 120

当然,这甚至不接近您的示例,但它显示了使用包装类的概念证明。

请注意,如果您有递归定义(例如b.update(() -> Integer.sum(a.value(), c.value()));(,此实现可能会引发StackOverflowError

正如你提到的,你是Java的新手,你可以在这里阅读更多关于lambda表达式的信息。您可能还想阅读有关惰性计算的信息。

为了完成其他人所说的,为了重现上述 Swift 代码的真实语义行为,你需要编写。

int number1 = 1;
int number2 = 2;
final int sum = number1 + number2;
number1 = number1 + 1;

为了接近你想象的行为,你可以这样写:

int number1 = 1;
int number2 = 2;
java.util.function.IntSupplier sum = () -> number1 + number2;
number1 = number1 + 1;

。但是您必须使用sum作为sum.getAsInt()来获取当前值。 当number1number2是局部变量时,它们必须在实例化 lambda 的点上有效地成为最终变量

最新更新