gpt4 book ai didi

scala - 当给定这个模式与整数值匹配时,为什么 scala 会提示?

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

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

示例:

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

我最初做了什么:

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 _ 的语句 block 无法访问。

我是如何修复它的

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 中是否有内置的工具已经可以做到这一点?

最佳答案

模式中的

lastIndex 是新名称的隐式声明,该名称绑定(bind)到放入匹配中的任何值,并隐藏已定义的 lastIndex,就像其他名称一样两个帖子已经指出了。除了使用大写标识符之外,还有其他两种可能性(请参阅 Peter 的帖子):

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

case `lastIndex` => ...

使用模式保护:

case x if x == lastIndex => ...

如果您想对字符串进行大量基于索引的删除,那么通过在字符串上调用 toBuffer 来使用 Buffer 会更快,然后您可以使用 remove( i: Int) Buffer 的方法。仅对于一项操作来说速度较慢,因为完成后您必须将缓冲区转换回字符串,但如果您执行许多随机访问操作,则速度会快得多。完成后,您可以在缓冲区上调用 mkString 来取回字符串。对于单个删除,我会按照彼得的建议进行操作,或者这里有一个替代方案:

def takeAllExcept(i: Int, s: String) = s.take(i) + s.drop(i+1)

关于scala - 当给定这个模式与整数值匹配时,为什么 scala 会提示?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5153590/

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