RudziankoŇ≠ RudziankoŇ≠ - 3 months ago 9
Scala Question

Fetch value using 'case' in scala

I am new in scala, don't be mad at me for a nub question, please help me see how

case
parsing works on my example:

I want to parse such string:

6546263252026003359 192.168.1.1


So basically I want split them by
and parse the first one as
Integer
and the second one
IPAdress
to a such structure:

class IPAddress(val cartage1 : Integer, cartage2 : Integer, cartage3: Integer, cartage4 : Integer) {

}


Could you please help me to do it?

phg phg
Answer

I suppose by "case parsing" you mean the extractor of the regex class? Well, a simple variant would be the following:

scala> val pattern = """(\d+)\s+(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})""".r
pattern: scala.util.matching.Regex = (\d+)\s+(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})

scala> val pattern(d, i1, i2, i3, i4) = "6546263252026003359  192.168.1.1"
d: String = 6546263252026003359
i1: String = 192
i2: String = 168
i3: String = 1
i4: String = 1

Whereby the regex should probably be worked on, if you want to ensure valid IPs.

What happens underneath is that pattern defines an unapply method of type String => Option[(Int, Int, Int, Int, Int)], so that something like

"6546263252026003359  192.168.1.1" match {
  case pattern(d, i1, i2, i3, i4) => IPAddress(i1, i2, i3, i4)
}

gets (roughtly) translated to this:

pattern.unapply("6546263252026003359  192.168.1.1") match {
  case Some((d, i1, i2, i3, i4)) => IPAddress(i1, i2, i3, i4)
  case None => /* throw some error */
}

The pattern assignment shown above works similar, it just modifies the local environment. Technicalities can be looked up here and probably in the spec.