Сопоставление с образцом не дает ожидаемых результатов - PullRequest
0 голосов
/ 10 июля 2019

Сопоставление с образцом не работает согласно пониманию.

Я прочитал концепции сопоставления с образцом в учебнике "Программирование в Scala".

У меня есть определение сопоставления с образцом, как показано ниже.

def checkMe (a:Any) =  a match {
      case Int => "I am an Integer"
      case Double => "I am a Double"
      case Char => "I am a Charecter"
      case _ => "I am something else"
     }

Независимо от того, что я прохожупри вызове функции всегда выполняется регистр по умолчанию.

Например: checkMa (100) выдает «Я что-то другое», checkMe (10.) также выдает «Я что-то другое» и т. д.

Может кто-нибудь помочь мне понять, что не так в определении.

Я ожидаю, что определение будет выполнено в соответствии с типом, который я передаю.

Ответы [ 2 ]

6 голосов
/ 10 июля 2019

Причина в том, что вы сопоставляете объект-компаньон (Int, Double, Char), а не фактический тип, решение состоит в том, чтобы сопоставить тип, подобный этому:

def checkMe (a:Any) =  a match {
  case _: Int => "I am an Integer"
  case _: Double => "I am a Double"
  case _: Char => "I am a Charecter"
  case _ => "I am something else"
}

Затем вы можете проверить в REPL, чтобы увидеть ожидаемые результаты:

@ checkMe(4) 
res3: String = "I am an Integer"

@ checkMe(4.0) 
res4: String = "I am a Double"

@ checkMe('a') 
res5: String = "I am a Charecter"

@ checkMe("Asdas") 
res6: String = "I am something else"
4 голосов
/ 10 июля 2019

вам нужно variable: Type для сопоставления с образцом,

  def checkMe(a: Any) = a match {
    case a: Int => "I am an Integer"
    case a: Double => "I am a Double"
    case a: Char => "I am a Charecter"
    case _ => "I am something else"
  }

пример - https://scastie.scala -lang.org / praagagupd / Pxzn4w8GQGCMIub33xMrRg / 1

...