-
-
Save paulp/9081797 to your computer and use it in GitHub Desktop.
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) |
xs was mutated on L7
You're basically doing buf.toIterable.asInstanceOf[List[Int]]
dressed up in the dubious legitimacy of a default-lacking pattern match.
Poo poo to Scala for providing this back door, but you can hardly complain about funny business when you're sneaking in through it.
Using asInstanceOf is the problem. I think it's just better to understand the relationship from an apparently unrelated unsafe function to the practical outcome.
Too few people make this connection in my experience.
@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.
@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.
Hi @paulp. Could you please tell me what's wrong? I'm missing it, but want to learn.