} 我可以这-6ren">
gpt4 book ai didi

scala - 在 Scala : ~(a, b) 中匹配 case 类匹配{case a~b=>...}

转载 作者:行者123 更新时间:2023-12-04 14:06:46 25 4
gpt4 key购买 nike

我有一个案例类

case class ~[a,b](_1:a, _2:b)

当我想做pattetn匹配时
new ~("a", 25) match{
case "a" ~ 25 =>
}

我可以这样使用它,因为 "a" ~ 25~("a", 25)是等价的。但是如果我想匹配 new ~("a", new ~("b", 25))来自 {case "a" ~ "b" ~ 25 => }麻烦开始了。我知道这些陈述并不等同。那么,如何 new ~("a", new ~("b", 25))可以介绍吗?按什么规则?

最佳答案

这有效:

new ~("a", new ~("b", 25)) match {
case "a" ~ ("b" ~ 25) =>
}

因此,您必须以与在初始子句中相同的方式放置括号。否则波浪号是左关联的,因此模式的类型将不同并且无法编译。
case "a" ~ "b" ~ 25

是相同的
case ("a" ~ "b") ~ 25

这在你的情况下是错误的。

附录

您可以通过将冒号作为类/方法名称中的最后一个字符来获得右结合性。以下编译和匹配没有括号(您可以删除 new 因为编译器不会再被 $tilde$colon 混淆):
case class ~:[a,b](_1:a, _2:b)

~:("a", ~:("b", 25)) match {
case "a" ~: "b" ~: 25 =>
}

回复

1) 没有 new关键字, case class ~unary_~ 遮蔽这给出了论点的按位否定。类似 ~ 2 的表达式内部评估为 unary_~(2) ~ ("a", 1)的情况也是如此– 但是除非您定义 unary_~在那个元组上,这会出错。与 new关键字您建议编译器显式查找具有该名称的类,因此不会混淆。
(从技术上讲,您可以使用 $tilde("a", 1) 来解决此问题,这是您的 case class ~ 的内部名称,但由于这是编译器的详细信息,因此您可能不应该依赖它。)

2&3) 右结合在 Scala Language Specification 中被引用. “中缀操作”部分

The associativity of an operator is determined by the operator’s last character. Operators ending in a colon ‘:’ are right-associative. All other operators are left-associative.



顺便说一句,右结合是允许使用 Nil 创建列表的技巧。 . ( Nil 是空的 List 并且定义了右关联连接运算符 ::。)
val l: List[Int] = 1 :: 2 :: 3 :: Nil

评估如下
val l: List[Int] = (1 :: (2 :: (3 :: Nil)))

或者,更准确地说,因为 3 :: NilNil.::(3) , 作为
val l: List[Int] = ( ( Nil.::(3) ).::(2) ).::(1)

关于scala - 在 Scala : ~(a, b) 中匹配 case 类匹配{case a~b=>...},我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3246155/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com