【问题标题】:Why is a single underscore character an illegal name for a lambda parameter?为什么单个下划线字符是 lambda 参数的非法名称?
【发布时间】:2015-12-30 01:30:58
【问题描述】:

我尝试将 lambda 参数命名为 _,例如(精简版):

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

因为我想表明一个参数被忽略,但我得到了以下编译器错误:

lambda 参数禁止使用“_”作为标识符

这对我来说是一个惊喜。有趣的是,两个下划线是可以的:

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

所以一般来说它不是下划线字符,而是一个。

为什么特别禁止使用单下划线名称?

【问题讨论】:

  • 请记住:仅仅因为两个下划线不被禁止,这并不是一个好主意。我们的目标不是智取编译器,而是编写代码,让那些阅读你的代码的穷人永远不必花一秒钟的时间去思考“这段代码做了什么”。
  • @BrianGoetz 我认为这个想法很好。导致我发现这一点(和真正的惊喜)的用例是编写一个不使用其参数的消费者(传递给现有的 API)。我通常使用单个字母作为 lambda 参数名称,所以我想我会遵循 spock 的引导(使用下划线作为通配符)来传达“忽略”。我最终只是使用“忽略”作为名称。尝试双下划线并不是试图规避;这是一个测试,以确认只有一个下划线是非法的(而不是一般的下划线字符)。新年快乐:)
  • @holger 这不是骗子。另一个问题不是问为什么,而是问这个。
  • @Bohemian:但 answer 解释了原因。这正是“这个问题在这里有答案”的意思。并不是说问题是相同的。甚至还有一个指向 Brian Goetz 帖子的链接(但在评论中)……
  • @ncmathsadist 使用下划线的一个很好的理由是groovy 被广泛使用,它使用下划线作为“任何东西”的占位符(绰号 wunderbar) 在其闭包(即 lambdas)中,因此是一个先例。

标签: java lambda java-8 underscores


【解决方案1】:

原因由Brian Goetz本人用this post表示:

我们正在从标识符空间中“回收”“_”的语法属性,以用于未来的语言功能。但是,由于存在可能使用它的现有程序,因此对于出现在 8 的现有句法位置中的标识符是一个警告,对于 lambda 形式是一个错误(因为没有带有 lambdas 的现有代码。)

【讨论】:

  • 这发生在另一种新的学术资助编程语言 (Scala) 将下划线用于特殊目的之后不久。
  • @Joop groovy 和 scala 一样,也将它用于“任意数量/类型的参数”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-04
  • 2011-02-13
相关资源
最近更新 更多