在编写函数时,如何决定是引用还是使用输入参数?
例如,我应该这样做吗?
fn foo(val: Bar) -> bool { check(val) } // version 1
Run Code Online (Sandbox Code Playgroud)
或者使用引用参数代替?
fn foo(val: &Bar) -> bool { check(*val) } // version 2
Run Code Online (Sandbox Code Playgroud)
在客户端,如果我只有第二个版本但想要消耗我的价值,我必须这样做:
// given in: Bar
let out = foo(&in); // using version 2 but wanting to consume ownership
drop(in);
Run Code Online (Sandbox Code Playgroud)
另一方面,如果我只有第一个版本但想保留我的参考,我必须这样做:
// given in: &Bar
let out = foo(in.clone()); // using version 1 but wanting to keep reference alive
Run Code Online (Sandbox Code Playgroud)
那么哪个是首选,为什么?
做出此选择时是否有任何性能考虑?或者编译器是否使它们在性能方面等效,以及如何实现?
您什么时候想提供两个版本(通过特征)?在那些时候,您如何编写这两个函数的底层实现——您是否复制每个方法签名中的逻辑,或者您是否有一个代理到另一个函数?哪个到哪个,为什么?
我有一个具有不同变体可能性的枚举,如下所示:
pub enum Enum {
Empty,
Single(Struct),
Multi(Vec<Struct>),
}
Run Code Online (Sandbox Code Playgroud)
我想创建典型的三个迭代函数来获取Structs for Enum:一种.iter()用于引用迭代器,两种用于.into_iter()获取引用和值上的迭代器。如何做到这一点?
这是我失败的尝试:
use std::{iter, slice, vec};
#[derive(Debug)]
pub struct Struct(u32);
#[derive(Debug)]
pub enum Enum {
Empty,
Single(Struct),
Multi(Vec<Struct>),
}
impl Enum {
fn iter(&self) -> slice::Iter<'_, Struct> {
match self {
Enum::Empty => iter::empty(),
Enum::Single(s) => iter::once(s),
Enum::Multi(v) => v.iter(),
}
}
}
impl IntoIterator for Enum {
type Item = Struct;
type IntoIter = vec::IntoIter<Struct>;
fn into_iter(self) -> Self::IntoIter {
match …Run Code Online (Sandbox Code Playgroud)