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

Scala匹配范围的问题

发布时间:2020-12-16 19:10:11 所属栏目:安全 来源:网络整理
导读:给出以下代码: case class ChangeSet(field:String,from:Object,to:Object)private var changed:List[ChangeSet] = Nildef change(field:String,to:Object) { changed.find{ case ChangeSet(field,_,_) = true } match { case Some(ChangeSet(field,to,_))
给出以下代码:

case class ChangeSet(field:String,from:Object,to:Object)

private var changed:List[ChangeSet] = Nil

def change(field:String,to:Object) {
  changed.find{ case ChangeSet(field,_,_) => true } match {
    case Some(ChangeSet(field,to,_)) => // do stuff
    case Some(_) => // do stuff
    case _ => // do stuff
  }
}

给我带来麻烦的一行是Some(ChangeSet(field,_)).

它编译但似乎正在发生的事情是Scala将其填充为通配符的占位符.我基于这样的假设,即当我执行以下操作时,一些(ChangeSet(field,to))我得到的错误已被定义为值.

我想要的是从方法参数中使用to创建一个ChangeSet对象.

那可能吗?

解决方法

模式匹配Scala将所有以小写字母开头的标识符解释为占位符并填充值.要告诉Scala使用to作为外部作用域的常量值,你需要用反引号来包围它:`to`.或者,您可以将Re的名称更改为To,如Rex Kerr建议的那样,但我更喜欢将变量保持为小写.

这应该工作:

def change(field:String,to:Object) {
  changed.find{ case ChangeSet(`field`,_) => true } match {
    case Some(ChangeSet(`field`,`to`,_)) => // do stuff
    case Some(_) => // do stuff
    case _ => // do stuff
  }
}

(编辑:李大同)

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

    推荐文章
      热点阅读