2016-06-15 1 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, List, Seq и Iterable, в основном любой тип, который определяет foreach функцию (похоже, я не должен проверять существование этой функции, если это не единственный способ ...)

+9

Это имеет смысл, потому что 'Array' не' Iterable'. Возможно, мы могли бы помочь, если бы вы объяснили, что вы на самом деле пытаетесь сделать, начиная с описания нерабочего решения. – Dima

+2

Один из способов проверки заключается в использовании 'v.isInstanceOf [Iterable]', но, как говорит @Dima, было бы лучше, если бы вы были более откровенными о том, что вы пытаетесь сделать. – Eduardo

+1

Почему у вас есть «Любые» в первую очередь? – Ryan

ответ

1

Почему бы не использовать шаблон?

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

EDIT

Поскольку вы хотите перебрать привести, но не знаю, что внутри, единственный способ, которым я могу себе представить, что-то вроде этого:

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