2015-01-29 9 views
11

Poniższy kod (playground)Dlaczego ten wzór dopasowania jest niedostępny w przypadku używania niedosłownych wzorców?

let max_column = 7; 
edge = match current_column { 
    0 => Edge::Left, 
    max_column => Edge::Right, 
    _ => Edge::NotAnEdge 
}; 

wyniki w następujący błąd:

error[E0001]: unreachable pattern 
    --> <anon>:10:9 
    | 
10 |   _ => Edge::NotAnEdge 
    |  ^this is an unreachable pattern 
    | 
note: this pattern matches any value 
    --> <anon>:9:9 
    | 
9 |   max_column => Edge::Right, 
    |   ^^^^^^^^^^ 

Wymiana zmiennej max_column z dosłownych działa dobrze:

let max_column = 7; 
edge = match current_column { 
    0 => Edge::Left, 
    7 => Edge::Right, 
    _ => Edge::NotAnEdge 
}; 

Dlaczego _ nieosiągalny w pierwszy przykład, kiedy można go uzyskać dla dowolnych wartości, gdzie current_column != max_column?

+2

Jeśli 'max_column' był stałą, to by działało, ale wzory działają tylko statycznie. –

Odpowiedz

13

W przykładzie max_column to nazwa zmiennej na związanie się, nie stałą lub zmienną na zewnątrz. Chcesz mecz straży:

let current_column = 1; 
let max_column = 7; 
edge = match current_column { 
    0     => Edge::Left, 
    a if a == max_column => Edge::Right, 
    _     => Edge::NotAnEdge 
}; 

pamiętać, że a i _ są naprawdę samo! W obu przypadkach dopasowana zmienna zostanie powiązana z nazwą (odpowiednio) (a lub _), ale każdy identyfikator poprzedzony prefiksem _ jest stosowany jako nieużywany zmienny element zastępczy (patrz bluss' clarification/correction).

+0

Wow. Ta składnia jest dla mnie przynajmniej nieintuicyjna. –

+6

@MikeVella Alternatywą jest, że 'x =>/* domyślny przypadek, używając x * /' ramienia dopasowywania przestaje być domyślnym przypadkiem kiedy nazwa 'x' jest wprowadzana w dowolnym widocznym zasięgu. To niespójne i, dla mnie, również sprzeczne z intuicją. – delnan

+3

'_' jest oddzielnym przypadkiem specjalnym, nie jest to w ogóle wiązanie zmiennej, ale jest to brak jednego! Dopasowanie do '_x' przenosi wartość do' _x', '_' nie ma takiej rzeczy. (Różnica jest zauważalna.) – bluss

Powiązane problemy