Scala模式匹配解包时如何直接声明given变量?
问题解答
先看你的代码场景:
def foo(using s: String) = ??? case class S(s: String) val value = S("some string") value match { case S(str) => given s: String = str foo }
你想知道能不能在模式匹配解包str时,直接把它声明为given,不用额外写一行赋值语句。
核心结论
截至Scala 3的当前版本,没有语法支持在case子句的模式里直接将解包变量声明为given实例。模式匹配的语法设计中,case后的模式部分只能用于绑定普通变量,无法直接创建given上下文实例。
现有最优写法
你找到的这种写法已经是最简洁的方案了:
case S(str) => given String = str foo
它避免了重复命名变量,仅用一行完成given实例的声明,已经最大限度简化了代码。
补充说明
你提到实际代码用的是更独特的类型,不用担心String作为given带来的歧义问题,这点完全没问题——这种写法对于自定义类型同样适用,只要类型足够唯一,就不会出现上下文查找冲突。
内容的提问来源于stack exchange,提问作者Troy Daniels
相关产品推荐
相关产品推荐

