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 
    } 
} 

これは(、タイプArrayListの変数のためにtrueを返しSeq、およびIterableforeach関数を定義し、基本的にあらゆる種類の必要が​​あります唯一の方法でない限り、その機能の存在をテストする必要があるようには思われません...)

+9

「Array」は「Iterable」ではないので、意味があります。たぶん、実際に何をしようとしているのかを、説明していれば、役に立たない解決策を記述することから始めれば、もっと助けになるかもしれません。 – Dima

+2

それをチェックする1つの方法は、 '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 
} 

EDIT

あなたが生じるように反復処理したいが、内部のだかわからないので、私は想像することができる唯一の方法は、このようなものです:

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

この方法あなたの入力が何であっても、Listが返され、それを反復処理することができます。 iterableでない場合、空のリストになります。

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

これはまさに私が試みたものですが、 'Iterable'型の変数に対してのみ機能し、' Array'や 'List'では動作しません。これは繰り返し実行することもできます。 – spiffman

+0

私は自分の答えを更新しましたが、最高ではありませんが、うまくいくはずです。 –

+0

これも同様に考えましたが、反復可能なすべてのタイプと一致させる必要はありませんか?私は、タイプが反復をサポートしているかどうかをテストする一般的な方法があることを期待していました。 – spiffman

関連する問題