2015-06-27 2 views
2

Я создал объект для демонстрации использования использования прецедентного класса как:переменного связывания с рисунком в случае п в выражении соответствия лестницы

object MatchWithPattern extends App 
{ 
    case class Person(firstName:String,lastName:String); 
    def whatYouGaveMe(obj:Any):String={ 
       obj match { 
       case str : String => s"you gave me a String ${str}"; 
       case person : Person(firstName,lastName) => s" You gave me a Person Object with ${person.firstName} ${person.lastName}"; 
       case default => "You gave me a Any class Object"; 
       } 

     } 

    var person= new Person("Mukesh", "Saini"); 
    Console.println(whatYouGaveMe(person)); 
} 

и код не компилируется и выдаю ошибку

ошибки : '=>' ожидалось, но '(' найдено

Теперь я могу изменить следующие

case person : Person(firstName,lastName) => s" You gave me a Person Object with ${person.firstName} ${person.lastName}"; 

в

case person @ Person(firstName,lastName) => s" You gave me a Person Object with ${person.firstName} ${person.lastName}"; 

код компилируется и работает успешно.

Теперь изменения

case str : String => s"you gave me a String ${str}"; 

в

case str @ String => s"you gave me a String ${str}"; 

, и это дает мне ошибку, как:

ошибка: объект java.lang.String не является значением

Тот же случай относится к

case list : List(1,_*) // gives error 

case list @ List(1,_*) // run successfully 

Так что мой вопрос заключается в том, что, когда я должен использовать @ вместо :

Благодаря

ответ

4

Двоеточие используется, чтобы соответствовать против типа, то @ используется для выполнения рекурсивное совпадение шаблонов с помощью метода unapply предмета в правой части.

В ваших примерах String является типом, но Person(x,y) и List(1,_*) - нет.

+0

: Я новичок в Scala, поэтому, если вы предоставите более подробную информацию, мне будет полезно понять его более четко. – optional

+0

Crystal clear после добавления второй строки как: String - это тип, но Person (x, y) и List (1, _ *) – optional