Thursday, January 21, 2010

Exclude style import semantics

I can't remember if I posted this tip yet so I will do it again (or not :-P ).

If you want to import all classes in a package or object exception for one or two there is a neat trick to exclude the unwanted elements:
  1. /*
  2. The File class is aliased to _ (oblivion) and then everything is imported (except File since it does not exist in that scope)
  3. Note: File can be imported later
  4. */
  5. scala> import java.io.{File=>_,_}
  6. import java.io.{File=>_, _}
  7. scala> new File("it is a file")      
  8. < console>:8: error: not found: type File
  9.        new File("it is a file")
  10. scala> object O {
  11.      | def one = 1
  12.      | def two = 2
  13.      | def o = 0
  14.      | }
  15. defined module O
  16. /*
  17. Same tricks can apply to importing methods and fields from objects
  18. */
  19. scala> import O.{o=>_, _}
  20. import O.{o=>_, _}
  21. scala> one
  22. res2: Int = 1
  23. scala> two
  24. res3: Int = 2
  25. scala> o
  26. < console>:15: error: not found: value o
  27.        o
  28. // Once a class is imported into scope it can not be removed
  29. scala> import java.io.File
  30. import java.io.File
  31. scala> import java.io.{File=>_}
  32. import java.io.{File=>_}
  33. /*
  34. this still works because the previous import statement only adds an alias it does not remove the alias
  35. */
  36. scala> new File("..")          
  37. res6: java.io.File = ..
  38. // There can be multiple aliases in a scope
  39. scala> import java.io.{File=>jfile}
  40. import java.io.{File=>jfile}
  41. scala> new jfile("..")
  42. res0: java.io.File = ..
  43. // one more example of importing from objects
  44. scala> case class X(a:Int, b:Int, c:Int)
  45. defined class X
  46. scala> val x = new X(1,2,3)
  47. x: X = X(1,2,3)
  48. scala> import x.{a=>_,b=>_,_}
  49. import x.{a=>_, b=>_, _}
  50. scala> c 
  51. res1: Int = 3
  52. scala> b
  53. < console>:14: error: not found: value b
  54.        b
  55.        ^

No comments:

Post a Comment