2015-06-15 14 views
7

Sto provando a utilizzare Mul da core.Perché devo usare self :: core :: ops?

Ciò è suggerito dal compilatore e lavora:

extern crate core; 

use self::core::ops::Mul; 

ma perché non

extern crate core; 

use core::ops::Mul; 

lavoro?

ottengo l'errore error: unresolved import `core::ops::Mul`. Did you mean `self::core::ops`?

+4

Perché non usare 'std :: ops :: Mul'? – mdup

+2

@mdup perché il compilatore ha detto 'core' e questa è una parte super-non ovvia di Rust :-( – Shepmaster

risposta

11

Un extern crate x; carica x nello spazio dei nomi corrente. Le istruzioni use sono percorsi assoluti a meno che non inizi con self::, quindi se metti il ​​tuo extern crate core; in qualsiasi posto tranne la radice della cassa, allora devi specificare un percorso assoluto o usare self::.

mod foo { 
    mod bar { 
     extern crate core; 
     use foo::bar::core::ops::Mul; 
     // or `use self::core::ops::Mul;` 
     // or even `use super::bar::core::ops::Mul;` if you’re mad 
     // but not `use core::ops::Mul;`. 
    } 
} 

... ma come regola generale, non si dovrebbe usare core direttamente in ogni caso. Tutto il materiale stabile da esso è disponibile in std che è incluso automaticamente.

0

Si scopre che dovrei usare use std::ops::Mul;.

+0

L'uso di' libcore' è possibile, ed è per la situazione in cui stai costruendo senza 'libstd'. 'libstd', è ciò che il canale stabile di Rust espone al momento. – bluss