gpt4 book ai didi

java - 奇怪的 Java 变量绑定(bind)行为

转载 作者:行者123 更新时间:2023-12-02 01:28:20 25 4
gpt4 key购买 nike

我有以下类(class)

public class Envirionment {

private Square[][] grid;

public Envirionment(int width, int height) {
this.grid = new Square[height][width];
}

public void map(SquareActor actor) {
for(int y = 0; y < grid.length; y++) {
for(int x = 0; x < grid[y].length; x++) {
actor.act(grid[y][x]);
}
}

}
}

为了测试 map 方法是否正常工作,我开始构建一个测试,测试的目标是传入一个可以作用于方 block 的函数,看看它是否是工作正常。

此测试的主要部分之一是确保它实际上循环遍历所有方 block ,因此我认为我可以传入一个函数,该函数可以绑定(bind)到 xy 循环变量,并使用xy的值调用回调函数,并在测试中保留一个本地计数器进行比较和对比。

我首先测试是否可以传入一个仅打印出 xy 变量的函数,但我遇到了第一个障碍。

class EnvirionmentTest {

@Test
void test() {
Envirionment env = new Envirionment(10, 10);
env.map((square) -> System.out.println(String.format("%d, %d", x, y)));
fail("Not yet implemented");
}

}

事实证明,编译器开始对我大喊大叫,因为 xy 无法解析为变量,但我认为它们会绑定(bind)到它们的循环范围会被称为内。

是否可以在java中设置这些变量的绑定(bind)?或者我处理这个问题的方法完全错误吗?

<小时/>

编辑:

我刚刚在 python 中尝试了类似的东西,它似乎工作得很好。

test = lambda : print(str(x) + "," str(y))
for y in range(2):
for x in range(2):
test()

输出:

0,0
1,0
0,1
1,1

最佳答案

在你的 python 示例中,你创建了 lambda 表达式,它在 Java 中有等价的:

BiConsumer<String, String> biFunction = (x, y) -> System.out.println(x + "," + y);

在您的示例中,您收到编译错误,因为在此表达式中:

env.map((square) -> System.out.println(String.format("%d, %d", x, y)));

编译器不知道xy是什么,他是对的。

您的Environment::map方法采用SquareActor类型的参数。您将 lambda 表达式传递给 Environment::map ,它将被解析为实现 SquareActor 的匿名类的实例,而该匿名类必须是 FunctionalInterface。在你的情况下,你的 lambda 表达式必须看起来像

env.map((square, x, y) -> System.out.println(String.format("%d, %d", x, y)));

但是它与 SquareActor::act 方法签名不匹配。 Java并不支持你所认为的闭包。如果你想知道如何在 Java 中实现闭包,请查看 this article .

您的Environment::map方法只是循环遍历内部数组并将参数传递给SquareActor::act。所以你不应该访问 SquareActor::act 中的本地循环计数器,你不这么认为吗?如果您想测试您的方法,您只需检查您的“模拟”实现是否会被触发尽可能多的次数:

env.map(square -> System.out.println(String.format("Square " + square)));

应该足够了(如果您重写 Square 类的 toString 方法。

关于java - 奇怪的 Java 变量绑定(bind)行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56509861/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com