我想为几个具体的功能实现自定义特征,即
trait ToTarget {
fn custom_str(&self) -> String;
}
impl ToTarget for fn() -> String {
fn custom_str(&self) -> String {
self()
}
}
impl ToTarget for fn(i32) -> String {
fn custom_str(&self) -> String {
self(4)
}
}
fn a() -> String {
"abc".to_string()
}
fn b(x: i32) -> String {
x.to_string()
}
fn main() {
println!("{}", b.custom_str());
}
但是,这不会编译给出下一个错误:
<anon>:26:22: 26:34 error: no method named `custom_str` found for type `fn(i32) -> collections::string::String {b}` in the current scope
<anon>:26 println!("{}", b.custom_str());
^~~~~~~~~~~~
note: in expansion of format_args!
<std macros>:2:25: 2:56 note: expansion site
<std macros>:1:1: 2:62 note: in expansion of print!
<std macros>:3:1: 3:54 note: expansion site
<std macros>:1:1: 3:58 note: in expansion of println!
<anon>:26:5: 26:36 note: expansion site
<anon>:26:22: 26:34 help: items from traits can only be used if the trait is implemented and in scope; the following trait defines an item `custom_str`, perhaps you need to implement it:
<anon>:26:22: 26:34 help: candidate #1: `ToTarget`
error: aborting due to previous error
playpen: application terminated with error code 101
但是,如果我指定b的类型,代码编译:
println!("{}", (b as fn(i32) -> String).custom_str());
所以问题是:有没有办法用
制作我的第一个代码版本println!("{}", b.custom_str());
编译?每次我想使用我的特性时指定功能类型真的很烦人。
答案 0 :(得分:2)
问题是每个函数都有自己的类型,但可能与另一个函数具有相同的签名。您为签名为ToTarget
的所有函数实现了特征fn(i32) -> String
。
例如:您的函数b
的类型为fn(i32) -> collections::string::String {b}
(请注意类型中的{b}
),但您无法明确指定此类型。
您可以为实施ToTarget
的所有类型实施Fn(i32) -> String
:
trait ToTarget {
fn custom_str(&self) -> String;
}
impl<T> ToTarget for T where T: Fn(i32) -> String {
fn custom_str(&self) -> String {
self(4)
}
}
fn b(x: i32) -> String {
x.to_string()
}
但是,您无法为ToTarget
或其他任何类型实现Fn() -> String
,因为可能存在实现Fn(i32) -> String
AND Fn() -> String
的类型,相同类型的两种不同实现。据我所见,即使impl specialization在这里也没有帮助,所以你运气不好。