(Привет), у меня есть вопросы, касающиеся буксировки дженерики в ржавчине:Параметрический Изменчивость
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());
}
Любой уборщик путь?
Спасибо, я обновил свой ответ. – BigEpsilon
Интересно, что существует определенная степень параметрической изменчивости с 'Index' /' IndexMut' и 'Deref' /' DerefMut', поэтому можно утверждать, что Rust уже опрокинул свои пальцы. –