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());
}
任何清洁的方式?
谢谢,我更新了我的答案。 – BigEpsilon 2014-11-22 12:01:07
有趣的是,“Index”/'IndexMut'和'Deref' /'DerefMut'有一定程度的参数可变性,所以可以认为Rust已经倾倒了脚趾。 – 2014-11-22 18:10:51