2015-12-30 12 views
12

Próbowałem nazywać parametr lambda _, np. (A wycięte wersja):Dlaczego jeden znak podkreślenia jest niedozwoloną nazwą parametru lambda?

Consumer<Object> c = _ -> {}; 

jak chciałem oznacza, że ​​parametr jest ignorowany, ale mam następujący błąd kompilatora:

use of '_' as an identifier is forbidden for lambda parameters

To było zaskoczenie dla mnie. Co ciekawe, dwa podkreślenia jest OK:

Consumer<Object> c = __ -> {}; // no compile error 

Więc to nie jest znak podkreślenia w ogóle, ale ani jednego.

Dlaczego nazwa pojedynczego podkreślenia jest specjalnie zabroniona?

+3

Pamiętaj: tylko dlatego, że dwa podkreślenia nie jest zabronione, nie sprawia, że ​​to dobry pomysł. Celem nie jest przechytrzenie kompilatora, to napisanie kodu, że biedni ludzie, którzy * przeczytali * twój kod, nigdy nie będą musieli spędzić chwili zastanawiając się "co robi ten kod". –

+1

@ BrianGoetz Myślę, że pomysł jest dobry. Przypadkiem, który doprowadził mnie do odkrycia tego (i prawdziwego zaskoczenia) było zakodowanie konsumenta, który nie użył jego parametru (aby przejść do istniejącego API). Generalnie używam pojedynczych liter dla nazw parametrów lambda, więc pomyślałem, że podążę za spockiem (używając znaku podkreślenia jako symbolu wieloznacznego), aby przekazać "ignorowanie". Skończyło się na tym, że używałem "ignore" jako nazwy. Próba podwójnego podkreślenia nie była próbą obejścia; był to test potwierdzający, że tylko jedno podkreślenie było nielegalne (raczej niż znak podkreślenia w ogóle). Szczęśliwego Nowego Roku :) – Bohemian

+2

@holger to nie jest dupe. Drugie pytanie nie pyta * dlaczego *, to robi. – Bohemian

Odpowiedz

21

Powodem jest wyrażona w this post z Brian Goetz siebie:

We are "reclaiming" the syntactic real estate of "_" from the space of identifiers for use in future language features. However, because there are existing programs that might use it, it is a warning for identifiers that occur in existing syntactic positions for 8, and an error for lambda formals (since there is no existing code with lambdas.)

Powiązane problemy