Я родом из C++ фона и интересно, если я мог code up a trait for use in the foo
and bar
functions:Черты характера с параметризованными связанными типами
#![feature(alloc)]
use std::rc::{Rc, Weak};
pub trait MyTrait {
/// Value type
type VAL;
/// Strongly boxed type
/// Will be constrained to something like Box, Rc, Arc
type SB;
/// Weakly boxed type
type WB;
}
struct MyFoo;
impl MyTrait for MyFoo {
type VAL = i64;
type SB = Rc<i64>;
type WB = Weak<i64>;
}
fn foo<T: MyTrait>(value: T::VAL) {}
// Uncomment
// fn bar<T: MyTrait>(rc_val: T::SB<T::VAL>) {}
fn main() {
let x = 100 as i64;
let y = Rc::new(200 as i64);
foo::<MyFoo>(x);
// Uncomment
// bar::<MyFoo>(y);
println!("Hello, world!");
}
foo
работает, но вложенная аргумент типа rc_val
в bar
вызывает проблемы:
error[E0109]: type parameters are not allowed on this type
--> src/main.rs:25:34
|
25 | fn bar<T: MyTrait>(rc_val: T::SB<T::VAL>) {}
| ^^^^^^ type parameter not allowed
Я видел что-то около this на канале IRC, связанном с Более сокровенные типы, но я не знаком с функциональной программой ING. Может ли кто-нибудь предложить обходной путь для того, что я пытаюсь сделать здесь? Этот код был протестирован в playground с сборкой nightly
.
Конвенция изменится 'VAL',' 'SB' и WB' к вещам, как' value', «Сильные» и «Слабые». –