具有参数化关联类型的特征

时间:2015-04-23 19:55:52

标签: rust traits

我来自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

我在与高级类型相关的IRC频道上看到了this的一些内容,但我对函数式编程并不熟悉。有人可以为我在这里尝试做的事情提出一个解决方法吗?此代码已在playground中使用nightly版本进行了测试。

1 个答案:

答案 0 :(得分:5)

设计意味着you should be able to just write

// Send a notification
pubsub.Notify();

pubsub.Subscribe
(
     () =>
     {
          // Do stuff here if I receive a notification
     }
);

fn bar<T: MyTrait>(rc_val: T::SB) {} MyTrait的特征实施已经指定了MyFoo的类型参数。

如果您要连接SBSB,可以在VAL上设置特征界限,例如:

SB