使函数实例化其泛型参数
Make functions instantiate its generic parameter
什么相当于以下 Rust 中的 C++ 程序?
#include <iostream>
#include <vector>
template <typename T>
T stuff() {
return T();
}
int main() {
std::vector<int> vec = stuff<std::vector<int>>();
vec.push_back(1);
for (auto &&i : vec) {
std::cout << i << std::endl;
}
}
我尝试了以下方法:
trait Newable{
fn new() -> Self;
}
fn stuff<T: Newable>() -> T {
T::new()
}
我尝试为此使用新类型 -
struct NwVec<T>{
vec: Vec<T>
}
impl<T> Newable<T> for NwVec<T>{
fn new() -> Self {
NwVec { vec: Vec::new() }
}
}
并像这样使用它:
fn main() {
let x: NwVec<i32> = stuff::<NwVec<i32>>();
}
但我得到了
error[E0277]: the trait bound `NwVec<i32>: Newable<NwVec<i32>>` is not satisfied
--> src\main.rs:2:25
|
2 | let x: NwVec<i32> = stuff();
| ^^^^^ the trait `Newable<NwVec<i32>>` is not implemented for `NwVec<i32>`
|
= help: the following implementations were found:
<NwVec<T> as Newable<T>>
note: required by a bound in `stuff`
有没有办法实现C++程序实现的功能?
P.S.: 我对 Rust 比较陌生,如果这个问题的解决方案很简单,我真的很抱歉。
当您输入您所说的代码时,可能出现了错误,因为当我尝试时,相同的代码并没有产生特定的错误。
无论哪种方式,你都接近了。考虑这段代码:
trait Newable {
fn new() -> Self;
}
fn stuff<T: Newable>() -> T {
T::new()
}
#[derive(Debug)]
struct NwVec<T> {
vec: Vec<T>
}
impl<T> Newable for NwVec<T> {
fn new() -> Self {
NwVec { vec: Vec::new() }
}
}
fn main() {
let x: NwVec<i32> = stuff::<NwVec<i32>>();
println!("{x:?}");
}
我改变的是:
- 已将
#[derive(Debug)]
添加到 NwVec<T>
以便我们可以将其打印出来
- 我从您原来的
impl<T> Newable<T> for NwVec<T>
中删除了 Newable<T>
上的类型参数 <T>
。这是因为 Newable
特性本身,如您的 post 中所提供的,不是通用的,因此它不需要类型参数。
我认为这是一种学习练习,但如果您好奇,您可能会对 std::default::Default
which is a trait somewhat similar to your Newable
in that implementations provide a simple and consistent way to create a "default" version of something. Vec
itself is an implementer, so you can call e.g. Default::default()
or Vec::default()
wherever a Vec<T>
is expected. Check this playground.
感兴趣
加上@JorgeIsraelPeña 的出色回答,如果您坚持 Newable
,则不需要新类型。只要 特征 或 类型是你的,你就可以为类型实现特征(好吧,实际规则是 a bit more complicated).这意味着您可以直接为 Vec
:
实现 Newable
impl<T> Newable for Vec<T> {
fn new() -> Self {
Vec::new()
}
}
fn main() {
let x = stuff::<Vec<i32>>();
println!("{x:?}");
}
什么相当于以下 Rust 中的 C++ 程序?
#include <iostream>
#include <vector>
template <typename T>
T stuff() {
return T();
}
int main() {
std::vector<int> vec = stuff<std::vector<int>>();
vec.push_back(1);
for (auto &&i : vec) {
std::cout << i << std::endl;
}
}
我尝试了以下方法:
trait Newable{
fn new() -> Self;
}
fn stuff<T: Newable>() -> T {
T::new()
}
我尝试为此使用新类型 -
struct NwVec<T>{
vec: Vec<T>
}
impl<T> Newable<T> for NwVec<T>{
fn new() -> Self {
NwVec { vec: Vec::new() }
}
}
并像这样使用它:
fn main() {
let x: NwVec<i32> = stuff::<NwVec<i32>>();
}
但我得到了
error[E0277]: the trait bound `NwVec<i32>: Newable<NwVec<i32>>` is not satisfied
--> src\main.rs:2:25
|
2 | let x: NwVec<i32> = stuff();
| ^^^^^ the trait `Newable<NwVec<i32>>` is not implemented for `NwVec<i32>`
|
= help: the following implementations were found:
<NwVec<T> as Newable<T>>
note: required by a bound in `stuff`
有没有办法实现C++程序实现的功能?
P.S.: 我对 Rust 比较陌生,如果这个问题的解决方案很简单,我真的很抱歉。
当您输入您所说的代码时,可能出现了错误,因为当我尝试时,相同的代码并没有产生特定的错误。
无论哪种方式,你都接近了。考虑这段代码:
trait Newable {
fn new() -> Self;
}
fn stuff<T: Newable>() -> T {
T::new()
}
#[derive(Debug)]
struct NwVec<T> {
vec: Vec<T>
}
impl<T> Newable for NwVec<T> {
fn new() -> Self {
NwVec { vec: Vec::new() }
}
}
fn main() {
let x: NwVec<i32> = stuff::<NwVec<i32>>();
println!("{x:?}");
}
我改变的是:
- 已将
#[derive(Debug)]
添加到NwVec<T>
以便我们可以将其打印出来 - 我从您原来的
impl<T> Newable<T> for NwVec<T>
中删除了Newable<T>
上的类型参数<T>
。这是因为Newable
特性本身,如您的 post 中所提供的,不是通用的,因此它不需要类型参数。
我认为这是一种学习练习,但如果您好奇,您可能会对 std::default::Default
which is a trait somewhat similar to your Newable
in that implementations provide a simple and consistent way to create a "default" version of something. Vec
itself is an implementer, so you can call e.g. Default::default()
or Vec::default()
wherever a Vec<T>
is expected. Check this playground.
加上@JorgeIsraelPeña 的出色回答,如果您坚持 Newable
,则不需要新类型。只要 特征 或 类型是你的,你就可以为类型实现特征(好吧,实际规则是 a bit more complicated).这意味着您可以直接为 Vec
:
Newable
impl<T> Newable for Vec<T> {
fn new() -> Self {
Vec::new()
}
}
fn main() {
let x = stuff::<Vec<i32>>();
println!("{x:?}");
}