Tuesday, December 8, 2009

Labelled Multiple Returns

A cool idea I found at http://stackoverflow.com/questions/1827672/is-there-a-way-to-have-tuples-with-named-fields-in-scala-similar-to-anonymous-cl. A very simple idea but very useful.
To summarize, you want to return multiple values but want to assign names to the values rather than use a tuple which more or less assigns indices to the different values. Here are a couple of solutions:

Using structured types. Simplest solution with the least extra code.
  1. scala> def multipleReturns1 = {
  2.      | new { val first = 1; val second = 2 }
  3.      | }
  4. multipleReturns1: java.lang.Object{def first: Intdef second: Int}
  5. scala> multipleReturns1
  6. res0: java.lang.Object{def first: Intdef second: Int} = $anon$1@549b6976
  7. scala> res0.first
  8. res1: Int = 1
  9. scala> res0.second
  10. res2: Int = 2
  11. scala> import res0._
  12. import res0._
  13. scala> first
  14. res3: Int = 1
  15. scala> second
  16. res4: Int = 2

Using case classes. Returns a product which has properties that may be useful.
  1. scala> def moreReturns = {
  2.      | case class Returns (one:Int, two:Int)
  3.      | Returns(1,2)
  4.      | }
  5. moreReturns: java.lang.Object with ScalaObject with Product{def one: Intdef two: Int}
  6. scala> moreReturns
  7. res5: java.lang.Object with ScalaObject with Product{def one: Intdef two: Int} = Returns(1,2)
  8. scala> res5.one
  9. res6: Int = 1
  10. scala> res5.two
  11. res7: Int = 2
  12. scala> import res5._
  13. import res5._
  14. scala> one
  15. res8: Int = 1
  16. scala> two
  17. res9: Int = 2
  18. scala> res5.productIterator foreach println _
  19. 1
  20. 2
  21. scala> res5.productPrefix
  22. res15: java.lang.String = Returns

No comments:

Post a Comment