stu*_*tub 6 scala pattern-matching case-class
我有一个案例课
case class ~[a,b](_1:a, _2:b)
Run Code Online (Sandbox Code Playgroud)
当我想做pattetn匹配
new ~("a", 25) match{
case "a" ~ 25 =>
}
Run Code Online (Sandbox Code Playgroud)
我可以使用这种方式,因为"a" ~ 25和~("a", 25)是等价的.但如果我想new ~("a", new ~("b", 25))通过{case "a" ~ "b" ~ 25 => }麻烦来匹配开始.我知道这些陈述并不等同.那么,如何 new ~("a", new ~("b", 25))呈现?按什么规则?
Deb*_*ski 10
这有效:
new ~("a", new ~("b", 25)) match {
case "a" ~ ("b" ~ 25) =>
}
Run Code Online (Sandbox Code Playgroud)
因此,您必须将括号与初始子句中的括号相同.否则,波浪号是左关联的,因此模式的类型将是不同的,并且它将不会编译.
case "a" ~ "b" ~ 25
Run Code Online (Sandbox Code Playgroud)
是相同的
case ("a" ~ "b") ~ 25
Run Code Online (Sandbox Code Playgroud)
在你的情况下这是错误的.
附录
通过将冒号作为类/方法名称中的最后一个字符,可以获得正确的关联性.以下编译和匹配没有括号(你可以删除,new因为编译器不会再混淆了$tilde$colon):
case class ~:[a,b](_1:a, _2:b)
~:("a", ~:("b", 25)) match {
case "a" ~: "b" ~: 25 =>
}
Run Code Online (Sandbox Code Playgroud)
回应
1)如果没有new关键字,case class ~则通过阴影unary_~给出参数的按位否定.类似于~ 2内部计算的表达式也是unary_~(2)如此~ ("a", 1)- 但是除非您unary_~在该元组上定义,否则会产生错误.使用new关键字,您建议编译器显式查找具有该名称的类,因此不会混淆.(从技术上讲,你可以通过使用$tilde("a", 1)哪个是你的内部名称来解决这个问题case class ~,但由于这是一个编译器细节,你可能不应该依赖它.)
2&3)Scala语言规范中引用了右关联性."中缀运营"部分
操作员的关联性由操作员的最后一个字符决定.以冒号':'结尾的运算符是右关联的.所有其他运算符都是左关联的.
顺便说一下,右关联性是允许创建列表的技巧Nil.(Nil是空的List并且::定义了右关联连接运算符.)
val l: List[Int] = 1 :: 2 :: 3 :: Nil
Run Code Online (Sandbox Code Playgroud)
评估如下
val l: List[Int] = (1 :: (2 :: (3 :: Nil)))
Run Code Online (Sandbox Code Playgroud)
或者更准确地说,因为3 :: Nil≡ Nil.::(3),as
val l: List[Int] = ( ( Nil.::(3) ).::(2) ).::(1)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
468 次 |
| 最近记录: |