我看到了其他一些答案,并咨询了我的老师,但我似乎无法得到我想要的答案。在 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()
来获取当前值。 当number1
或number2
是局部变量时,它们必须在实例化 lambda 的点上有效地成为最终变量。