2015-04-23 4 views
2

Я родом из 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.

+1

Конвенция изменится 'VAL',' 'SB' и WB' к вещам, как' value', «Сильные» и «Слабые». –

ответ

5

дизайн означает, что you should be able to just write

fn bar<T: MyTrait>(rc_val: T::SB) {} 

Реализация черта MyTrait для MyFoo уже определяет параметр типа для SB.

Если вы хотите подключить SB и VAL, можно поместить признак оце SB, например:

trait MyTrait { 
    type VAL; 
    type SB: Deref<Target = Self::VAL>; 
} 
Смежные вопросы