Skip to content

Instantly share code, notes, and snippets.

@paulp
Created February 18, 2014 22:29
Show Gist options
  • Save paulp/9081797 to your computer and use it in GitHub Desktop.
Save paulp/9081797 to your computer and use it in GitHub Desktop.
Classic.
scala> val buf = ListBuffer(1)
buf: scala.collection.mutable.ListBuffer[Int] = ListBuffer(1)
scala> val xs = buf.toIterable match { case xs: List[Int] => xs }
xs: List[Int] = List(1)
scala> buf ++= 1 to 100
res11: buf.type = ListBuffer(1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100)
scala> xs
res12: List[Int] = List(1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100)
@paulp
Copy link
Author

paulp commented Feb 19, 2014

@samskivert That assessment is incorrect in numerous ways. I'm amazed people want to make excuses for this. Typecase is built into scala, it is absolutely unavoidable - there's not even any separation between ADTs and matching against arbitrary types. Matching against collections types is completely standard. The "default lacking" is irrelevant, I can add a default and it's exactly the same. "case _ => Nil".

It isn't a question of what tricks I can play on myself, but of what guarantees the standard data structures are going to make. For an "immutable" class, the non-negotiable guarantee is that it be immutable, like this isn't.

@paulp
Copy link
Author

paulp commented Feb 19, 2014

@kman007us List is advertised as an "immutable" data structure, which means it won't suddenly go from having 1 element to having 101 elements.

@tonymorris
Copy link

Typecase is absolutely avoidable in Scala.

@som-snytt
Copy link

For some reason, no one complained about the ScalaDoc. After the dot.

http://www.scala-lang.org/api/current/index.html#scala.collection.mutable.ListBuffer@toIterable:Iterable[A]

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment