2016-06-15 52 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