2014-11-22 39 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 
} 

这里我想要的是当T是可变的时,x()和y()返回一个对可变T的引用,否则是不可变的引用? 我看到一些关于参数可变性的内部讨论,但我没有找到任何建立的RFC。

2-是否有计划添加参数化数值(如template<size_t n>)生锈?

感谢

更新:所以我客人,现在唯一的解决办法是类似的东西:

#![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 2014-11-22 12:01:07

+0

有趣的是,“Index”/'IndexMut'和'Deref' /'DerefMut'有一定程度的参数可变性,所以可以认为Rust已经倾倒了脚趾。 – 2014-11-22 18:10:51