Tuesday, October 4, 2016

Pattern Matching on 'case class' : Example...

scala> ////////////////////////////////////////////////////////////////

scala> // Pattern matching on 'case class' : Example... #309

scala> ////////////////////////////////////////////////////////////////

scala> abstract class Subject
defined class Subject

scala> case class Math(mark: Int) extends Subject
defined class Math

scala> case class History(mark:Int) extends Subject
defined class History

scala> case class Science(mark:Int) extends Subject
defined class Science

scala> case class Geography(mark:Int) extends Subject
defined class Geography

scala> case class TwoSubject(s1: Subject, s2: Subject) extends Subject
defined class TwoSubject

scala>

scala> //By Creating a variable that is starting with a Capital Letter

scala> //we are creating a Symbolic Constant #313

scala> val Mark = 50
Mark: Int = 50

scala> val newmark = 55
newmark: Int = 55

scala>

scala> def checkSubject(sub: Subject) = sub match {
     |     //Math(10) : Represets a Constructor Pattern #310
     |     //10 : Represents the Constant Pattern
     |     case Math(10) => println("Math : mark -> 10")
     |
     |     //x : Represents variable pattern
     |     case Math(x) => println("Math : x -> " + x)
     |
     |     // _ : Represents Wild card pattern
     |     case History(_) => println("history. Not possible to access mark")
     |
     |     // Variable binding using @ ; 320
     |     case TwoSubject(Science(x), geo @ Geography(50)) => {
     |         println("Twosubject : Science -> " + x + ", Geo -> " + geo)
     |     }
     |
     |     //Although this looks like a Variable pattern(as we are using
     |     //  variable name), this is actually a Constant Pattern
     |     //  as the Variable name starts with a Capital Letter(so it
     |     //  is a Symbolic Constant)
     |     case Science(Mark) => println("Science : Mark : 50")
     |
     |     //Variable names starting with lower case letter can
     |     //  also be made symbolic constants by using backtics #315
     |     case Science(`newmark`) => println("Science : Mark -> 55")
     |
     |     // Without this wildcard ( ie ... _), we will get
     |     // match error
     |     case _ => println("Nothing matched...")
     | }
checkSubject: (sub: Subject)Unit

scala>

scala> checkSubject(Math(10))
Math : mark -> 10

scala> checkSubject(Math(50))
Math : x -> 50

scala> checkSubject(History(60))
history. Not possible to access mark

scala> checkSubject(TwoSubject(Science(10), Geography(50)))
Twosubject : Science -> 10, Geo -> Geography(50)

scala> checkSubject(TwoSubject(Science(10), Geography(60)))
Nothing matched...

scala> checkSubject(Science(50))
Science : Mark : 50

scala> checkSubject(Science(55))
Science : Mark -> 55

scala> checkSubject(Geography(90))
Nothing matched...