2015-12-30 1 views
12

J'ai essayé de nommer un paramètre lambda _, par ex. (Une version réduite):Pourquoi un seul caractère de soulignement est-il un nom illégal pour un paramètre lambda?

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

que je voulais signifier qu'un paramètre a été ignoré, mais je suis l'erreur du compilateur suivant:

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

Ce fut une surprise pour moi. Fait intéressant, deux underscores est OK:

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

Il est donc pas le caractère underscore en général, mais un seul.

Pourquoi le nom de soulignement unique est-il spécifiquement interdit?

+3

Rappelez-vous: juste parce que deux underscores est pas interdit, ne fait pas une bonne idée. Le but n'est pas de déjouer le compilateur, c'est d'écrire du code que les pauvres qui ont * lu * votre code n'auront jamais à passer une seconde à se demander "qu'est-ce que ce code fait". –

+1

@BrianGoetz Je pense que l'idée est bonne. Le cas d'utilisation qui a conduit à ma découverte de cette (et véritable surprise) codait un consommateur qui n'utilisait pas son paramètre (pour passer à une API existante). J'utilise généralement des lettres simples pour les noms de paramètres lambda, donc j'ai pensé que je suivrais l'exemple de Spock (d'utiliser un trait de soulignement comme caractère générique) pour transmettre "ignorer". J'ai fini par utiliser "ignore" comme nom. Essayer un double trait de soulignement n'était pas une tentative de contournement; c'était un test pour confirmer que seulement un trait de soulignement était illégal (plutôt que le caractère de soulignement en général). Bonne année :) – Bohemian

+2

@holger ce n'est pas une dupe. L'autre question ne demande pas * pourquoi *, c'est le cas. – Bohemian

Répondre

21

La raison est exprimée en this post de Brian Goetz lui-même:

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