Ho creato una struttura a due elementi Vector
e desidero sovraccaricare l'operatore +
.Come si implementa il tratto Aggiungi per un riferimento a una struttura?
Ho fatto in modo che tutte le mie funzioni e metodi prendessero riferimenti, piuttosto che valori, e voglio che l'operatore +
funzioni allo stesso modo.
impl Add for Vector {
fn add(&self, other: &Vector) -> Vector {
Vector {
x: self.x + other.x,
y: self.y + other.y,
}
}
}
A seconda della variante che cerco, o ottengo problemi di durata o tipo mancate corrispondenze. In particolare, l'argomento &self
sembra non essere trattato come il tipo giusto.
Ho visto esempi con argomenti modello su impl
e Add
, ma hanno solo errori diversi.
Ho trovato How can an operator be overloaded for different RHS types and return values? ma il codice nella risposta non funziona anche se inserisco uno use std::ops::Mul;
nella parte superiore.
Sto usando rustc 1.0.0-serale (ed530d7a3 2015-01-16 22:41:16 +0000)
Non accetterò "hai solo due campi, perché usare un punto di riferimento", come una domanda; e se volessi una struct di 100 elementi? Accetterò una risposta che dimostri che anche con una grande struttura dovrei passare per valore, se questo è il caso (non penso che lo sia, però). Sono interessato a conoscere una buona regola empirica per le dimensioni della struttura e passando per value vs struct, ma questa non è la domanda corrente.
"e se volessi una struct 100 elementi" - Rust utilizza ottimizzazioni come RVO che utilizzerà automaticamente un riferimento quando appropriato e la scelta migliore. – Shepmaster
@Shepmaster: RVO influenzerà solo il valore di ritorno, che sto restituendo in base al valore. Puoi indicare tutta la documentazione che mostra che i tratti per le grandi strutture dovrebbero essere implementati in base al valore? –
La migliore documentazione che conosco sarebbe il [capitolo del libro sui puntatori di ritorno] (http://doc.rust-lang.org/book/pointers.html#returning-pointers). Tuttavia, ho [creato un esempio di aggiunta di una struttura grande] (http://is.gd/25ITa7) e controllato il LLVM generato (leggermente pulito): '(% struct.Big * sret,% struct.Big *,% struct.Big *) '. Non pretendo di essere un esperto di LLVM, ma sembra che stia prendendo e tornando automaticamente per riferimento. – Shepmaster