Scala中字符串模式匹配时必须使用反引号的原因是什么?
Scala模式匹配的标识符匹配规则
Scala的match表达式中,case后标识符的匹配逻辑由标识符的命名格式决定:
- 若标识符首字母为小写,默认被识别为「变量绑定模式」:Scala会将当前匹配的输入值绑定到这个全新的局部变量上,匹配逻辑永远成立,不会去引用外部作用域的同名变量。
- 若要明确表示要匹配外部作用域已定义的同名小写变量的值,必须用反引号包裹该标识符,告诉编译器这是值匹配而非变量绑定。
你最初的代码中case left =>属于典型的变量绑定场景,相当于将任意输入的key值绑定到局部变量left,第一个分支永远命中,后续分支自然都是不可达代码。修改为case `left`后,编译器才会将其识别为「匹配值等于类构造参数left的输入」,符合你的预期逻辑。
等价写法参考
反引号的值匹配逻辑和守卫表达式效果完全一致:
// 反引号写法 case `left` => (-1, 0) // 等价守卫写法 case k if k == left => (-1, 0)
补充说明
如果匹配目标是首字母大写的常量,Scala会自动识别为值匹配,不需要额外加反引号:
val LEFT_KEY = "left" // 首字母大写自动识别为值匹配,无需反引号 case LEFT_KEY => (-1, 0)
内容的提问来源于stack exchange,提问作者Tarmiac
相关产品推荐
相关产品推荐

