Created
February 18, 2014 22:29
-
-
Save paulp/9081797 to your computer and use it in GitHub Desktop.
Classic.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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) |
@kman007us List is advertised as an "immutable" data structure, which means it won't suddenly go from having 1 element to having 101 elements.
Typecase is absolutely avoidable in Scala.
For some reason, no one complained about the ScalaDoc. After the dot.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
@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.