2015-08-01 11 views
7

Khi tôi viết một mã đơn giản cho kim loại trần mà không sử dụng libcore tôi nhận được lỗi sau:Thực hiện thao tác cơ bản để tích hợp trong các loại mà không sử dụng libcore

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

Straight thực hiện chuyển tiếp phải đối mặt với vấn đề con gà và quả trứng :

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

Ở đây tôi nhận được lỗi sau:

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

+0

"* Thực ra tôi đã giải quyết được vấn đề của mình *" - bạn cũng có thể thêm cách bạn giải quyết nó như một câu trả lời; đó là hành vi được chấp nhận hoàn toàn và được khuyến khích. – Shepmaster

+0

Nói chính xác hơn là tôi đã tìm thấy giải pháp cho vấn đề (chỉ cần sao chép đoạn mã libcore tương ứng), không giải quyết được. Vì vậy, tôi không thể thêm câu trả lời. – ababo

+1

Tôi không thể sao chép lỗi của bạn mà bạn mô tả trên [sân chơi] (https://play.rust-lang.org/?gist=7c9ce3e7575ffc7b76e2&version=nightly) (cảnh báo! Nhiều hack để có được nó để biên dịch!). Nó biên dịch tốt sau khi giải quyết tất cả các lỗi "mục lang thiếu". Bạn có thể cung cấp một liên kết đến một playpen thể hiện vấn đề của bạn? – thirtythreeforty

Trả lời

3

Đây là thực sự là hành vi mong đợi ngày nay. Rust yêu cầu mục "thêm" lang được triển khai cho loại, ngay cả khi nó là một kiểu tích hợp sẵn. Việc thực hiện có thể hoàn toàn không có thật (miễn là nó biên dịch), vì nó sẽ là replaced by the built-in operation.

Lý do điều này được thực hiện theo cách này là việc kiểm tra loại mã được xây dựng trong các loại đã lỗi và phức tạp. Làm theo cách này đơn giản hóa mã kiểm tra kiểu và các triển khai đặc điểm đã có sẵn.

Therefor bạn cần phải thêm hai tờ khai sau để có thể sử dụng toán tử + thậm chí trên được xây dựng trong loại 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 } 
} 

Dưới đây là một ví dụ đầy đủ mà không liên kết vì nó thiếu một số libc thứ: https://play.rust-lang.org/?gist=a223d48b0f2d8533996f&version=nightly

Lưu ý rằng bạn không nên tạo ra một thực hiện giả mạo như, bởi vì bạn có thể sử dụng được xây dựng trong loại trong một bối cảnh chung, nơi thực hiện sẽ thực sự được sử dụng

Các vấn đề liên quan