加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

在scala中匹配case类:?(a,b)匹配{case a~b => …}

发布时间:2020-12-16 18:52:46 所属栏目:安全 来源:网络整理
导读:我有一个案例课 case class ~[a,b](_1:a,_2:b) 当我想做pattetn匹配 new ~("a",25) match{ case "a" ~ 25 =} 我可以这样使用它因为“a”~25和?(“a”,25)是等价的.但是如果我想通过{case“a”?“b”~25 =匹配新的?(“a”,new?(“b”,25)).麻烦开始了.我知道
我有一个案例课

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

当我想做pattetn匹配

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

我可以这样使用它因为“a”~25和?(“a”,25)是等价的.但是如果我想通过{case“a”?“b”~25 =>匹配新的?(“a”,new?(“b”,25)).麻烦开始了.我知道这些陈述并不等同.那么,如何呈现新的?(“a”,25))?按什么规则?

解决方法

这有效:

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

因此,您必须将括号与初始子句中的括号相同.否则,波浪号是左关联的,因此模式的类型将是不同的,并且它将不会编译.

case "a" ~ "b" ~ 25

是相同的

case ("a" ~ "b") ~ 25

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

附录

通过将冒号作为类/方法名称中的最后一个字符,可以获得正确的关联性.以下编译和匹配没有括号(你可以删除新的,因为编译器不会再被$tilde $冒的混淆):

case class ~:[a,_2:b)

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

回应

1)没有new关键字,case类?被unary_~遮蔽,这给出了参数的按位否定.像~2这样的表达式在内部被评估为unary_~(2),对于?(“a”,1)的情况也是如此 – 但是除非你在该元组上定义unary_~,否则会??产生错误.使用new关键字,建议编译器显式查找具有该名称的类,这样就不会混淆.
(从技术上讲,你可以通过使用$tilde(“a”,1)解决这个问题,这是你的case类的内部名称?,但由于这是一个编译器细节,你可能不应该依赖它.)

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,并且具有右关联连接运算符:: defined.)

val l: List[Int] = 1 :: 2 :: 3 :: Nil

评估如下

val l: List[Int] = (1 :: (2 :: (3 :: Nil)))

或者更准确地说,因为3 ::Nil≡Nil.::( 3),as

val l: List[Int] = ( ( Nil.::(3) ).::(2) ).::(1)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读