2014-11-22 2 views
0

(Привет), у меня есть вопросы, касающиеся буксировки дженерики в ржавчине:Параметрический Изменчивость

1-я пытаюсь порта некоторые C++ увеличить как понятий к ржавчине (вот пример с 2D точки):

#![feature(associated_types)] 

pub trait Point2D { 
    type value_type; 
    fn x(&self) -> &<Self as Point2D>::value_type; 
    fn y(&self) -> &<Self as Point2D>::value_type; 
} 

#[deriving(Show)] 
pub struct Point2<T> { 
    x : T, 
    y : T, 
} 

impl<T> Point2D for Point2<T> { 
    type value_type = T; 

#[inline] 
    fn x(&self) -> &T { 
     &self.x 
    } 

#[inline] 
    fn y(&self) -> &T { 
     &self.y 
    } 
} 

fn main(){ 
    let mut p = Point2{x: 0i32, y : 0i32}; 

    println!("p = {}", p); 

    //*p.x() = 1i32; //error: cannot assign to immutable dereference of `&`-pointer 
} 

Здесь я хочу, чтобы x() и y() возвращали ссылку на mutable T, когда T является изменяемым, а неизменяемая ссылка в противном случае - возможно ли это? Я видел некоторые внутренние разговоры о параметрической изменчивости, но я не нашел никаких установленных RFC.

2 - Есть ли планы добавить параметризацию по числовым значениям (например, template<size_t n>) в ржавчину?

благодаря

Update: так что я на данный момент имеется единственное решение, что-то вроде этого:

#![feature(associated_types)] 

pub trait Point2D { 
    type value_type; 
    fn x_as_mut(&mut self) -> &mut <Self as Point2D>::value_type; 
    fn y_as_mut(&mut self) -> &mut <Self as Point2D>::value_type; 
    fn x_as_ref(&self) -> &<Self as Point2D>::value_type; 
    fn y_as_ref(&self) -> &<Self as Point2D>::value_type; 
} 

#[deriving(Show)] 
pub struct Point2<T> { 
    x : T, 
    y : T, 
} 

impl<T> Point2D for Point2<T> { 
    type value_type = T; 

#[inline] 
    fn x_as_mut(&mut self) -> &mut T { 
     &mut self.x 
    } 

#[inline] 
    fn y_as_mut(&mut self) -> &mut T { 
     &mut self.y 
    } 
#[inline] 
    fn x_as_ref(&self) -> &T { 
     &self.x 
    } 

#[inline] 
    fn y_as_ref(&self) -> &T { 
     &self.y 
    } 
} 

trait Channel { 

} 

fn main(){ 
    let mut p1 = Point2{x: 0i32, y : 0i32}; 

    println!("p1 = {}", p1); 

    *p1.x_as_mut() = 1i32; 

    println!("p1 = {}", p1); 

    let p2 = Point2{x:0u8, y:10u8}; 

    println!("p2 = {}", p2.y_as_ref()); 

} 

Любой уборщик путь?

ответ

2

Нет параметрической изменчивости. Я знаю, что несколько человек выразили сильное желание что-то по этим линиям, но пока я не знаю никаких реальных планов.

Также отсутствуют общие параметры параметров. Я считаю, что основная команда определенно хочет этого, но сейчас это не приоритет.

+0

Спасибо, я обновил свой ответ. – BigEpsilon

+0

Интересно, что существует определенная степень параметрической изменчивости с 'Index' /' IndexMut' и 'Deref' /' DerefMut', поэтому можно утверждать, что Rust уже опрокинул свои пальцы. –

Смежные вопросы