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(就像塊等)不創建命名範圍,但創建一個生命週期範圍?爲什麼? –