【发布时间】:2018-07-02 17:38:20
【问题描述】:
我想根据泛型类型T 是否实现Debug 来使do_something 的实现成为条件。有没有办法做这样的事情?
struct A(i32);
#[derive(Debug)]
struct B(i32);
struct Foo<T> {
data: T,
/* more fields */
}
impl<T> Foo<T> {
fn do_something(&self) {
/* ... */
println!("Success!");
}
fn do_something(&self)
where
T: Debug,
{
/* ... */
println!("Success on {:?}", self.data);
}
}
fn main() {
let foo = Foo {
data: A(3), /* ... */
};
foo.do_something(); // should call first implementation, because A
// doesn't implement Debug
let foo = Foo {
data: B(2), /* ... */
};
foo.do_something(); // should call second implementation, because B
// does implement Debug
}
我认为一种方法是创建一个特征,我们必须定义do_something(&Self),但我不确定。我的代码 sn-p 是我将首先尝试的。
【问题讨论】:
-
@Stargateur 我的意思是如果 T 实现 Trait 则执行 A ,如果 T 则执行 B >T 没有实现 Trait,所有这些都使用一个通用名称,例如
do_something(&Self) -
不可能两者都必须在这种情况下实现特征。 :/ 也许你应该阅读 trait 以及如何使用它们。
-
是的,我想是的,但只是想知道我是否不知道一些超高级的东西,但是在函数内部看到类似
if T impl Debug { A } else { B }的东西会很酷,我认为这是可能的,因为它像条件编译,所有这些都可以在编译时检查。