2015-12-30 9 views
12

ラムダパラメータ_の名前を付けてみました。 (バージョンをダウンカット):単一のアンダースコア文字がラムダパラメータの不正な名前であるのはなぜですか?

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

私はパラメータは無視されていたことを意味したかったが、私は次のコンパイラエラーを得たとして:

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

これは私にとって驚きでした。興味深いことに、アンダースコアはOKです:

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

だから、それは一般的にアンダースコア文字が、単一のものではありません。

なぜ単一のアンダースコア名は特に禁止されていますか?

+3

ただ覚えている:2つの下線が禁止されていないという理由だけで、それは良いアイデアことはありません。目標はコンパイラを凌駕することではなく、あなたのコードを読んだ貧しい人々が、このコードが何をするのかという第二の疑問を抱かせることは決してありません。 –

+1

@BrianGoetz私はその考えが良いと思います。これを発見したユースケース(および本物の驚き)は、パラメータを使用していない(既存のAPIに渡す)消費者をコーディングするケースでした。私は一般的にラムダのパラメータ名に一文字を使用するので、私は "無視"を伝えるためにspockのリード(ワイルドカードとしてアンダースコアを使う)に従うと思った。私はちょうど名前として "無視"を使用して終了しました。ダブルアンダースコアを試してみるのは、迂回を試みる試みではありませんでした。単一のアンダースコアが(一般的なアンダースコアではなく)違法であることを確認するテストでした。ハッピーニューイヤー: – Bohemian

+2

@holgerこれは偽ではありません。もう一つの質問は*なぜ*、これはしません。 – Bohemian

答えて

21

理由はBrian Goetzからthis postで自分自身を表現している。

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

関連する問題