2015-10-27 8 views
7

Sto provando ad estendere la struttura Grid dalla libreria pistone-2dgraphics. Non c'è alcun metodo per ottenere la posizione sulla finestra di una cella particolare, quindi ho implementato un tratto per calcolarlo per me. Quindi, volevo un metodo per calcolare i vicini di una particolare cella sulla griglia, quindi ho implementato un'altra caratteristica.C'è un modo diverso dai tratti per estendere le strutture?

Qualcosa di questo è brutto e sembra inutile visto che probabilmente non userò mai questi tratti per qualcosa di diverso da questa specifica struttura di griglia. Quindi, c'è un altro modo in Rust per estendere una struttura senza dover implementare i tratti ogni volta?

+2

AFAIK, n. Puoi comunque implementare un tratto con tutti i tuoi metodi. – Shepmaster

risposta

9

A partire da Rust 1.3, no, non c'è altro modo.

Non è possibile definire metodi inerenti su un tipo definito in un'altra cassa. Tuttavia, come sai, puoi definire il tuo tratto con i metodi di cui hai bisogno, quindi implementare quel tratto per un tipo esterno. Questo modello è noto come tratti di estensione. Il nome dei tratti di estensione, per convenzione, termina con Ext, per indicare che questo tratto non è pensato per essere utilizzato come un limite generico o come oggetto tratto. There are a few examples in the standard library.

Altre librerie possono anche esportare i tratti di estensione (esempio: byteorder). Tuttavia, come per qualsiasi altro tratto, è necessario portare i metodi del tratto nello scope con use SomethingExt;.

+0

Fantastico, grazie per la spiegazione. Non avevo idea dei tratti di estensione. Forse posso suggerire di farlo aggiungere al [libro] (https://doc.rust-lang.org/book/traits.html), poiché questo è il primo posto che ho controllato senza successo. – tsujin

4

No. Attualmente, l'unico modo per scrivere nuovi metodi per un tipo che è stato definito in un'altra cassa è attraverso i tratti. Tuttavia, questo sembra troppo ingombrante in quanto è necessario scrivere sia la definizione di tratto che l'implementazione.

A mio parere, la strada da percorrere è utilizzare le funzioni libere anziché i metodi. Ciò eviterebbe almeno la duplicazione causata dai tratti.

Problemi correlati