Java与Swift中的常量类型

时间:2018-10-06 03:16:11

标签: java swift

我还看到了其他答案,并与老师进行了协商,但是我似乎找不到想要的答案。快速地,如果我声明一个变量,则类似于:

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

如果我没记错的话,最后一行应该反过来将sum的值增加一。但据我所知,在Java中没有办法做到这一点。有人知道吗? (最底线是,我能否流畅地创建一个值,该值取决于其他变量?

如果我的问题有什么问题,请告诉我,

谢谢

4 个答案:

答案 0 :(得分:1)

Java和Swift都无法像这样工作。 Java中的int和Swift中的Int不会跟踪过去其他哪些值“贡献”了它们的值。

答案 1 :(得分:0)

  

如果我没记错的话,最后一行应该反过来将sum的值增加一。

您实际上记错了。

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

所有let所做的都是声明一个“常量”,即var,您将无法再对其进行更改。就像Java中的final int

也许您希望sum是一个函数/闭包?然后,只要您调用它,它就会产生“当前”值。

答案 2 :(得分:0)

正如其他人所说,这在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

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

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

如前所述,您是Java的新手,您可以阅读有关lambda表达式here的更多信息。您可能还想阅读有关lazy evaluation的信息。

答案 3 :(得分:0)

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

a <-window(x,end=2018)
fc.a <- rwf(a, drift = TRUE, h = 5)
autoplot(x) +
autolayer(fc.a, PI=FALSE)

要获得与您的想象行为相近的东西,可以这样写:

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是局部变量时,它们必须在实例化lambda的点上有效地终止。