我来自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
版本进行了测试。
答案 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
的类型参数。
如果您要连接SB
和SB
,可以在VAL
上设置特征界限,例如:
SB