So I had an error where a match expression always yielded unreachable cases looking like this.
class KeyControl(left: String, right: String, up: String, down: String){
    def direction(key: String): (Int, Int) = {
    key match{
      case left => (-1,0)
      case right => (1,0)
      case up => (0,-1)
      case down => (0,1)
      case _ => (0,0)
    }
  }
}
object HelloWorld {
   def main(args: Array[String]) {
      println("Hello, world!")
      
      val kc: KeyControl = new KeyControl("left", "right", "up", "down")
      
      println(kc.direction("up"))
      
   }
}
The correct output should be:
Hello, world!
(0,-1)
However I always got warnings and errors where case right, case up, case down always was unreachable. I couldn't wrap my head around why this happened. In my mind, it checks if key: String = "up" is equal to left: String = "left" [false] right: String = "right" [false] up: String = "up" [true] -> return (0,-1) But since case left always seems to be true I guess I'm wrong. When trying this exact code however in an online IDE I got the error:
HelloWorld.scala:5: warning: unreachable code due to variable pattern 'left' on line 4
If you intended to match against value right in class KeyControl, you must use backticks, like: case `right`
After following their recommendations and changing all cases to `left`, `right`, `up`, `down` the match expression now works perfectly. My question for the people here is why backticks are necessary when matching string values?
