2015-12-30 6 views
12

Ich versuchte, einen Lambda-Parameter _, z. (Eine abgespeckte Version):Warum ist ein einzelner Unterstrich ein ungültiger Name für einen Lambda-Parameter?

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

wie ich, dass ein Parameter, um anzuzeigen, wollte ignoriert wurde, aber ich habe den folgenden Compiler-Fehler:

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

Das war eine Überraschung für mich. Interessanterweise zwei Unterstrichen ist OK:

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

Es ist also nicht der Unterstrich im allgemeinen, sondern ein einziger.

Warum ist der Name des einzelnen Unterstrichs ausdrücklich verboten?

+3

Denken Sie daran: Nur weil zwei Unterstrichen nicht verboten ist, ist es nicht eine gute Idee zu machen. Das Ziel ist nicht, den Compiler zu überlisten, es ist Code zu schreiben, dass die armen Leute, die * Ihren Code * gelesen haben, nie eine Sekunde damit verbringen müssen, sich zu fragen, "was macht dieser Code?". –

+1

@BrianGoetz Ich denke, die Idee ist gut. Der Anwendungsfall, der zu meiner Entdeckung führte (und echte Überraschung) war die Codierung eines Verbrauchers, der seinen Parameter nicht verwendete (um zu einer bestehenden API zu gelangen). Ich verwende normalerweise einzelne Buchstaben für Lambda-Parameternamen, also dachte ich, ich würde Spocks Spur folgen (um einen Unterstrich als Platzhalter zu verwenden), um "Ignorieren" zu vermitteln. Ich habe am Ende nur "ignorieren" als Name verwendet. Der Versuch, eine doppelte Unterstreichung vorzunehmen, war kein Umgehungsversuch; Es war ein Test, um zu bestätigen, dass nur ein einziger Unterstrich illegal war (im Gegensatz zum Unterstrich im Allgemeinen). Frohes Neues Jahr :) – Bohemian

+2

@holger das ist kein Betrogener. Die andere Frage fragt nicht * warum *, das tut es. – Bohemian

Antwort

21

Der Grund ist in this post von Brian Goetz sich ausdrückte:

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.)