Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@paulp
Created February 18, 2014 22:29
Show Gist options
  • Star 5 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • 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)
@kevinmeredith
Copy link

Hi @paulp. Could you please tell me what's wrong? I'm missing it, but want to learn.

@dustingetz
Copy link

xs was mutated on L7

@samskivert
Copy link

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.

@tonymorris
Copy link

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.

@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