2017-08-02 82 views
1

headOption方法,它返回集合头部的Option[T]从mutable.Buffer中删除选项

我想有类似removeOption(n: Int)返回和删除第n个元素,如果它在集合的范围内,否则什么也不做,并返回None

我可以这样做与模式匹配,但这似乎太杂乱。也许implicit class es会在这里帮助吗?

Actualyl我尝试这样做:

implicit class RemoveOptionImplicit[A](val t: mutable.Buffer[A]) extends AnyVal { 
    def removeOption(index: Int) = 
     if(index >= 0 & index < t.size) 
     Some(t.remove(index)) 
     else 
     None 
    } 

但不知道这是一个好办法。

+0

该清单应该返回什么? (标准列表是不可变的 - >删除必须创建一个新列表)。 它应该返回一个(Option [T],List [T])的元组吗? –

+0

@ThomasBöhm它应该返回'Option [T]',其中T是元素类型。如果存在'Some(el)',否则'None'。 –

回答

4

这个怎么样?

import scala.util.Try 
def safeRemove[A](mb: collection.mutable.Buffer[A], idx: Int): Option[A] = 
    Try(mb.remove(idx)).toOption 

它变异的Buffer,如果指数是良好的讨厌的副作用,但我认为这就是你想要的。


如果你不想处理异常,你的原创想法可以简化如此。

def safeRemove[A](mb: collection.mutable.Buffer[A], idx: Int): Option[A] = 
    if (mb.isDefinedAt(idx)) Option(mb.remove(idx)) 
    else None 

当然,通过隐式转换来拉动mutable.Buffer方法总是可能的。

+0

但是,如果索引不好,我们会发现异常吗?我觉得这太慢了。 –

+0

我在我的问题中添加了一些代码。你能不能给我一些评论? –

+1

我想出了@jwvh的第二种方法。我想你应该使用它。 –