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?
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". –
@ 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
@holger to nie jest dupe. Drugie pytanie nie pyta * dlaczego *, to robi. – Bohemian