Scala集合的索引与切片操作实现方式咨询
Scala集合切片操作实现方案
Scala原生就内置了slice方法,和你提到的JavaScript的slice用法完全一致,直接就能用,不需要自己基于take、drop拼接。
基础用法示例
你给出的示例可以直接这么写:
val aString = "I want this word" val aList = List(1,2,3,4) // 参数规则:(起始索引, 结束索引),左闭右开,和JS逻辑完全一致 val slicedString = aString.slice(7, 11) // 运行结果:"this" val slicedList = aList.slice(0, 2) // 运行结果:List(1, 2)
类Python范围索引写法说明
Scala原生语法不支持Python那种a[7:11]的冒号范围索引语法,不过你可以通过自定义扩展方法实现类似的调用效果,以Scala 3为例:
// 给List扩展支持范围参数的调用方法 extension [T](list: List[T]) def apply(r: Range): List[T] = list.slice(r.start, r.end) // 给String扩展同样能力 extension (s: String) def apply(r: Range): String = s.slice(r.start, r.end) // 扩展完成后就可以用类似Python的写法调用 val slicedString = aString(7 until 11) // 运行结果:"this" val slicedList = aList(0 until 2) // 运行结果:List(1,2)
补充说明
slice是Scala集合的通用方法,所有继承了Iterable特质的类型(Array、Seq、Set、Map等)都可以调用,通用度很高- 当传入的结束索引超过集合实际长度时,方法会自动截断到集合末尾,不会抛出索引越界异常,行为和JS的slice一致
- 如果起始索引大于等于集合长度,会直接返回空集合/空字符串
内容的提问来源于stack exchange,提问作者Shivam Sahil
相关产品推荐
相关产品推荐

