int x = 1;
Consumer<Object> f = (i) -> {
int x = 1; // invalid
};
Consumer<Object> f = (i) -> {
int x = 1;
};
int x = 1; // valid
想象一下,一个方法内的两个街区。为什么第二个块有效?
int x = 1;
Consumer<Object> f = (i) -> {
int x = 1; // invalid
};
Consumer<Object> f = (i) -> {
int x = 1;
};
int x = 1; // valid
想象一下,一个方法内的两个街区。为什么第二个块有效?
在第一个块中您是“shadowing”原始x
变量。您将无法通过创建新的x
来访问第一个x
。
第二块是好的,这是因为第二x
上的力矩产生时第x
不不再存在(它是超出范围)。
基本上:在第一种情况下,您试图同时有两个变量叫做x
。在第二种情况下,您会在彼此之后创建两个变量:它们的生命周期不会重叠。
这非常类似于普通的Java范围:
int i;
{
int i; // invalid
}
与
{
int i; // valid
}
int i;
我要写完全一样的东西! – Jyro117
[Synchronicity](http://en.wikipedia.org/wiki/Synchronicity)存在! :-) –
为什么心不是 “范围” 对称即可。如果lambda是如此透明,那么它应该是对称的 –
但范围根本不是对称的。甚至没有用于'for'循环或'if'语句的构造。 –
大声笑,所以lambda(就像块等)不创建命名范围,但创建一个生命周期范围?为什么? –