2015-08-01 24 views
7

kullanmadan ben aşağıdaki hatayı alıyorum libcore kullanmadan çıplak metal için basit bir kod yazarken:yerleşik türleri libcore

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

Yalındır uygulama-tavuk yumurta sorununu yüzleşir : Burada

#![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, 
}; 

aşağıdaki hata olsun:

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

+0

"Aslında sorunumu çözdüm *" - cevap olarak nasıl çözdüğünüzü de ekleyebilirsin; Bu mükemmel kabul edilebilir ve teşvik edici bir davranış. – Shepmaster

+0

Daha doğrusu sorunun çözülmediğini (sadece karşılık gelen libcore snippet'ini kopyaladım) çözdüğümü söylemek daha doğru. Bu yüzden cevap ekleyemiyorum. – ababo

+1

[Oyun alanında] tanımladığınız hatayı yeniden oluşturamıyorum (https://play.rust-lang.org/?gist=7c9ce3e7575ffc7b76e2&version=nightly) (uyarı! Derlemek için çok hackleme!). Tüm "kayıp lang öğesi" hatalarını ele aldıktan sonra iyi derler. Sorununuzu gösteren bir oyun parkına bağlantı verebilir misiniz? – thirtythreeforty

cevap

3

budur aslında bugünlerde beklenen davranış. Pas, yerleşik tür olsa bile, tür için uygulanacak "ekleme" lang öğesinin kullanılmasını gerektirir. Uygulama, replaced by the built-in operation olacağından tamamen sahte (derlediği sürece) olabilir.

Bunun yapılmasının sebebi, bu şekilde, yerleşik tiplerin kontrol edilmesi için kod tipinin kontrol edilmesi ve karmaşık olmasıdır. Bu şekilde yapmak, tip kontrol kodunu basitleştirdi ve özellik uygulamaları zaten vardı.

hatta üzerinde + operatörünü kullanmak edebilmek için aşağıdaki iki bildirimlerini eklemek ihtiyacı Therefor gömme tip 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 } 
} 

İşte bazı libc'yi eksik beri bağlantı vermeyen bir tam örnek şeyler: gösterildiği gibi kullanıyor olabilir, çünkü sahte bir uygulama oluşturmak YAPMAMAM https://play.rust-lang.org/?gist=a223d48b0f2d8533996f&version=nightly

Not yerleşik uygulama aslında kullanılacak bir jenerik bağlamda, tip