【问题标题】:When is case syntactically significant?什么时候大小写在语法上很重要?
【发布时间】:2017-03-15 08:24:07
【问题描述】:

A/a 案例,而不是 case 案例。

显然case a 匹配任何内容并将其绑定到名称a,而case A 查找A 变量并匹配== 认为等于A 的任何内容。这让我很惊讶。虽然我知道 Scala 区分大小写,但我从没想过标识符大小写会影响解析规则。

Scala 的语法关心标识符的大小写是常见的,还是只有少数上下文会发生这种情况?如果只有少数这样的上下文,它们是什么?我在谷歌上找不到任何东西;我得到的只是模式匹配的结果。

【问题讨论】:

  • 实际上,我相信这是唯一的,但我会留给比我更了解规范的人回答。
  • @Bergi:我实际上已经在问题中链接了它,虽然链接下划线的死亡,可能很难注意到。

标签: scala case-sensitive


【解决方案1】:

还有一个性质相似的,称为 type pattern。在类型模式中,以小写字母开头的简单标识符是类型变量,所有其他标识符都尝试匹配实际类型(_ 除外)。

例如:

val a: Any = List(1, 2, 3)
val c = 1

// z is a type variable
a match { case b: List[z] => a }

// Type match on `Int`
a match { case b: List[Int] => a }

// type match on the singleton c.type (not a simple lower case identifier)
// (doesn't actually compile because c.type will never conform)
a match { case b: List[c.type] => a }

像第一个示例一样的类型匹配鲜为人知,因为它几乎不被使用。

【讨论】:

  • Here 是类型变量的一个很好的例子。
  • 我真的希望不会有更多示例,但至少这两个示例遵循一致的模式。你知道这些是否是唯一的例子,截至 2.12? (不接受,因为我不想阻止进一步的答案或将其置顶,尤其是在语言发生变化并添加更多大小写重要性的情况下。)
  • @user2357112 我只能以 99.99% 的把握说,因为谁知道他们是否有没有人遇到过的奇怪错误,但是这两个类似的情况是规范中唯一提到的。不过,我很想看看是否有人提出了其他想法。
猜你喜欢
  • 2012-10-03
  • 1970-01-01
  • 2019-02-02
  • 1970-01-01
  • 2016-11-27
  • 2018-07-31
相关资源
最近更新 更多