2015-08-01 14 views
7

Quando scrivo un semplice codice per il metallo nudo senza usare libcore ottengo il seguente errore:Implementazione di operazioni di base per tipi built-in senza utilizzare libcore

error: binary operation != cannot be applied to type u32 [E0369]

Etero implementazione avanti affronta il problema di pollo e uova :

#![crate_type = "lib"] 
#![feature(no_std, no_core, lang_items)] 
#![no_std] 
#![no_core] 

#[lang = "sized"] 
pub trait Sized {} 

#[lang = "sync"] 
pub trait Sync {} 

pub const CONST1: u32 = 1; 
pub const CONST2: u32 = 2; 

pub struct Struct { 
    pub field: u32, 
} 

impl Sync for Struct {} 

pub static VAR: Struct = Struct { 
    field: CONST1 + CONST2, 
}; 

Qui ho il seguente errore:

error: binary operation + cannot be applied to type u32 [E0369]

+0

"* In realtà ho risolto il mio problema *" - potresti anche aggiungere come lo hai risolto come risposta; questo è un comportamento perfettamente accettabile e incoraggiato. – Shepmaster

+0

È più precisamente per dire che ho appena trovato una soluzione al problema (ho appena copiato lo snippet libcore corrispondente), non risolto. Quindi non posso aggiungere una risposta. – ababo

+1

Non riesco a riprodurre l'errore che descrivi nel [parco giochi] (https://play.rust-lang.org/?gist=7c9ce3e7575ffc7b76e2&version=nightly) (attenzione! Molto hacking per farlo compilare!). Compilano bene dopo aver risolto tutti gli errori "item lang mancanti". Potresti fornire un link a un box che mostri il tuo problema? – thirtythreeforty

risposta

3

Questo è in realtà il comportamento atteso al giorno d'oggi. Rust richiede l'elemento "aggiungi" lang da implementare per il tipo, anche se è un tipo predefinito. L'implementazione può essere completamente falsa (purché compili), poiché sarà replaced by the built-in operation.

Il motivo per cui questo è fatto in questo modo è che il tipo di codice che controlla i tipi built-in era buggato e complesso. Facendolo in questo modo semplificato il codice di controllo del tipo e le implementazioni dei tratti erano già lì comunque.

Perciò è necessario aggiungere le seguenti due dichiarazioni per essere in grado di utilizzare l'operatore + anche sul tipo built-in u32

#[lang = "add"] 
pub trait Add<RHS=Self> { 
    type Output; 
    fn add(self, rhs: RHS) -> Self::Output; 
} 

impl Add for u32 { 
    type Output = u32; 
    fn add(self, _rhs: u32) -> u32 { 42 } 
} 

Ecco un esempio completo che non collegano dal momento che manca un po 'di libc roba: https://play.rust-lang.org/?gist=a223d48b0f2d8533996f&version=nightly

si noti che non è necessario creare un'implementazione fasullo come indicato, in quanto si potrebbero utilizzare il built-in di tipo in un contesto generica, in cui sarà effettivamente utilizzato l'attuazione