首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么scala在给定这个模式与整值匹配时会抱怨呢?

问为什么scala在给定这个模式与整值匹配时会抱怨呢?
EN

Stack Overflow用户
提问于 2011-03-01 11:03:40
回答 3查看 418关注 0票数 3

目标:编写一个函数,该函数生成一个排除指定字符的新字符串(由索引标识)

示例:

  • takeAllExcept(0, "abc")返回bc
  • takeAllExcept(1, "abc")返回ac
  • takeAllExcept(2, "abc")返回ab

我最初做了什么,

代码语言:javascript
复制
def takeAllExcept( index: Int, s: String ): String = {
  val lastIndex = s.length()-1
  index match {
    case 0 => return s.slice(1, s.length)
    case lastIndex => return s.slice(0, s.length()-1)
    case _ => { s.slice(0, index) + s.slice(index+1, s.length) }
  }
}

编译器抱怨case _的语句块不可访问。

我是如何修正它的

代码语言:javascript
复制
def takeAllExcept( index: Int, s: String ): String = {
  val lastIndex = s.length()-1
  if( index == 0 )
    return s.slice(1, s.length)

  if( index == lastIndex )
    return s.slice(0, s.length()-1)

  s.slice(0, index) + s.slice(index+1, s.length)
}

我想知道为什么我最初的尝试在无法到达的代码中失败了。在我看来是合法的。另外,scala中是否有一个内置的设施已经这样做了?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-03-01 12:18:45

模式中的lastIndex是一个新名称的隐式声明,它绑定到匹配中的任何值,并对所有定义的lastIndex进行阴影,正如其他两篇文章所指出的那样。还有两种替代大写标识符的可能性(见Peter的文章):

使用backticks让编译器知道这不应该是新标识符的声明:

代码语言:javascript
复制
case `lastIndex` => ...

使用模式保护:

代码语言:javascript
复制
case x if x == lastIndex => ...

如果您想对字符串执行大量基于索引的移除操作,那么通过在字符串上调用toBuffer来使用缓冲区会更快,然后可以使用缓冲区的remove(i: Int)方法。这对于一个操作来说比较慢,因为您必须在完成时将缓冲区转换回字符串,但是如果您执行了许多随机访问操作,则速度要快得多。完成之后,您可以在缓冲区上调用mkString来获取字符串。对于一次性移除,我会像Peter建议的那样做,或者这里是另一种选择:

代码语言:javascript
复制
def takeAllExcept(i: Int, s: String) = s.take(i) + s.drop(i+1)
票数 10
EN

Stack Overflow用户

发布于 2011-03-01 11:23:11

你的第一个问题:

代码语言:javascript
复制
def takeAllExcept( index: Int, s: String ): String = {
  val LastIndex = s.length()-1
  index match {
    case 0 => return s.slice(1, s.length)
    case LastIndex => return s.slice(0, s.length()-1)
    case _ => { s.slice(0, index) + s.slice(index+1, s.length) }
  }
}

当模式匹配时,case后面的case是新绑定的,隐藏了val lastIndex = s.length()-1的定义。正如我的示例所示,您可以使用大写名称,然后scala在作用域中使用定义的val。

要回答你的第二个问题,我会解决它:

代码语言:javascript
复制
def takeAllExcept(i: Int, s: String): String = {
  val (prefix,suffix) = s.splitAt(i)
  prefix + suffix.tail
}
票数 6
EN

Stack Overflow用户

发布于 2011-03-01 11:28:06

代码语言:javascript
复制
val lastIndex = s.length()-1
index match {
  case 0 => return s.slice(1, s.length)
  case lastIndex => return s.slice(0, s.length()-1)
  case _ => { s.slice(0, index) + s.slice(index+1, s.length) }
}

第二个子句不像您期望的那样将index与lastIndex匹配,例如Prolog。相反,它匹配任何值,并将该值绑定到名称lastIndex,从而隐藏此变量的前一个绑定。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5153590

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档