2017-08-02 60 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的第二種方法。我想你應該使用它。 –