2010-02-23 14 views
7

J'ai recherché un peu mais je ne trouve aucun exemple démontrant l'utilisation de @ _ * pendant les classes de cas de correspondance de modèles.Je cherchais des exemples d'utilisation de "@ _ *" lors de la recherche de modèles dans Scala

Voici un exemple du type d'application auquel je fais référence.

def findPerimeter(o: SomeObject): Perimeter = o match { 
case Type1(length, width) => 
    new Perimeter(0, 0, length, width) 
case Type2(radius) => 
    new Perimeter(0, 0, 2*radius, 2*radius) 
... 

case MixedTypes(group @_*) => { 
    \\How could @_* be used to check subpatterns of group? 
} 

}

Si quelqu'un pouvait me montrer quelques exemples ou me pointer vers une page Web qui a quelques exemples qui serait génial.

Merci

Répondre

5

Rappelez-vous que quelque chose comme

Type2(3.0) match { 
    case t2 @ Type2(radius) => //... 
} 

se fixe radius à la valeur 3.0 et se fixe t2 à l'instance de type2 étant en correspondance avec.

En utilisant votre exemple:

def findPerimeter(o: SomeObject): Perimeter = o match { 
    case Type1(length, width) => new Perimeter(0, 0, length, width) 
    case Type2(radius) => new Perimeter(0, 0, 2*radius, 2*radius) 
    // ... 
    // assume that Perimeter defines a + operator 
    case MixedTypes(group @ _*) => group.reduceLeft(findPerimeter(_) + findPerimeter(_)) 

} 

Ici, group est lié à la séquence de SomeObject s qui définissent le MixedTypes. Vous pouvez traiter est juste comme une séquence de what-the-constructor-args-for-MixedTypes-est.