2016-06-15 45 views
0

我想創建一個函數來檢查是否可以迭代Any類型的變量。Scala:測試是否可以迭代任何變量

def checkIterable(v: Any): Boolean = { 
    // match with something? 
} 

然後,我將能夠使用它像:

if (checkIterable(something)) { 
    for (s <- something) { 
     // do something with each element s of something 
    } 
} 

這應該Array類型,ListSeq的變量返回true,Iterable,基本上任何類型的定義foreach功能(似乎並不像我應該測試的功能的存在,除非它是唯一可能的方式...)

+9

這很有道理,因爲'Array'不是'Iterable'。也許,如果你解釋了你真正想要做的事情,而是從描述非工作解決方案開始,我們可能會有更多的幫助。 – Dima

+2

檢查它的一種方法是使用'v.isInstanceOf [Iterable]',但是,正如@Dima所說,如果你更清楚你想要做什麼,會更好。 – Eduardo

+1

爲什麼你首先有一個'Any'? – Ryan

回答

1

爲什麼不使用模式匹配?

something match { 
    case xs: Iterable[_] => // do something with xs as iterable ... 
    case _ => // ... that's something other 
} 

編輯

由於要遍歷到的結果,但不知道里面有什麼,我可以想像,唯一的辦法是這樣的:

def toList(x: Any): List[Any] = x match { 
    case xs: Iterable[_] => xs.toList 
    case xs: Array[_] => xs.toList 
    case _ => List.empty 
} 

這樣,不管你的輸入是什麼,你會得到一個List回來,並可以迭代它。如果它不可迭代,它將是一個空的列表。

toList("foo")  // List[Any] = List() 
toList(List(1, 2, 3) // List[Any] = List(1, 2, 3) 
+0

這正是我第一次嘗試的,但它只適用於'Iterable'類型的變量,而不是'Array'或'List',它也可以被迭代。 – spiffman

+0

我已經更新了我的答案,不是最好的,但應該工作。 –

+0

我也考慮過這個,但是我不需要對每一個可迭代的類型進行匹配嗎? 'Array','List','Seq','Iterable','ListBuffer' ...我希望有一種通用的方法來測試一個類型是否支持迭代 – spiffman