diff options
author | Burak Emir <emir@epfl.ch> | 2007-01-25 08:57:46 +0000 |
---|---|---|
committer | Burak Emir <emir@epfl.ch> | 2007-01-25 08:57:46 +0000 |
commit | dd50828fda67a1af2b4bdaf760d88d065fb9a45f (patch) | |
tree | 9d57b0cb74fdb3579fbfd8ec8cb3043b228d3fe9 /src/library | |
parent | 3020baca77ebfd7b64a3920bec4aec73406a429c (diff) | |
download | scala-dd50828fda67a1af2b4bdaf760d88d065fb9a45f.tar.gz scala-dd50828fda67a1af2b4bdaf760d88d065fb9a45f.tar.bz2 scala-dd50828fda67a1af2b4bdaf760d88d065fb9a45f.zip |
matching on arrays via unapplySeq
Diffstat (limited to 'src/library')
-rw-r--r-- | src/library/scala/Array.scala | 8 | ||||
-rw-r--r-- | src/library/scala/Seq.scala | 13 | ||||
-rw-r--r-- | src/library/scala/runtime/ScalaRunTime.scala | 1 |
3 files changed, 17 insertions, 5 deletions
diff --git a/src/library/scala/Array.scala b/src/library/scala/Array.scala index 82745709ba..dd253ab658 100644 --- a/src/library/scala/Array.scala +++ b/src/library/scala/Array.scala @@ -157,6 +157,14 @@ object Array { array } + /** This method is called in a pattern match { case Array(...) => }. + * + * @param x the selector value + * @return array wrapped in an option, if this is a Seq, otherwise none + */ + def unapplySeq[A](x: Any): Option[Seq[A]] = + if (x.isInstanceOf[Array[A]]) Some(x.asInstanceOf[Array[A]]) else None + } /** This class represents polymorphic arrays. It is never instantiated. diff --git a/src/library/scala/Seq.scala b/src/library/scala/Seq.scala index 83deeef39e..1a488b82b2 100644 --- a/src/library/scala/Seq.scala +++ b/src/library/scala/Seq.scala @@ -23,13 +23,16 @@ object Seq { def elements = Iterator.empty } - /** ... + /** This method is called in a pattern match { case Seq(...) => }. * - * @param x ... - * @return ... + * @param x the selector value + * @return sequence wrapped in an option, if this is a Seq, otherwise none */ - def unapplySeq[A](x: Any): Option[Seq[A]] = - if (x.isInstanceOf[Seq[A]]) Some(x.asInstanceOf[Seq[A]]) else None + def unapplySeq[A](x: Any): Option[Seq[A]] = x match { + case z: Seq[_] => Some(z.asInstanceOf[Seq[A]]) + case z: AnyRef if runtime.ScalaRunTime.isArray(z) => Some(runtime.ScalaRunTime.boxArray(z).asInstanceOf[Seq[A]]) + case _ => None + } /** Builds a singleton sequence. * diff --git a/src/library/scala/runtime/ScalaRunTime.scala b/src/library/scala/runtime/ScalaRunTime.scala index f29ca6d1e7..248904c0e1 100644 --- a/src/library/scala/runtime/ScalaRunTime.scala +++ b/src/library/scala/runtime/ScalaRunTime.scala @@ -39,6 +39,7 @@ object ScalaRunTime { val BooleanTYPE = java.lang.Boolean.TYPE val UnitTYPE = java.lang.Void.TYPE + def isArray(x:AnyRef): Boolean = x.getClass.isArray def isValueTag(tag: String) = tag.charAt(0) == '.' def isValueClass(clazz: Class) = clazz.isPrimitive() |