小编pri*_*ior的帖子

如何决定函数输入参数何时应为引用?

在编写函数时,如何决定是引用还是使用输入参数?

例如,我应该这样做吗?

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)

那么哪个是首选,为什么?

做出此选择时是否有任何性能考虑?或者编译器是否使它们在性能方面等效,以及如何实现?

您什么时候想提供两个版本(通过特征)?在那些时候,您如何编写这两个函数的底层实现——您是否复制每个方法签名中的逻辑,或者您是否有一个代理到另一个函数?哪个到哪个,为什么?

ownership rust borrowing

20
推荐指数
2
解决办法
5038
查看次数

如何为可迭代变体的枚举实现 IntoIterator?

我有一个具有不同变体可能性的枚举,如下所示:

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)

enums iterator rust

4
推荐指数
1
解决办法
1726
查看次数

标签 统计

rust ×2

borrowing ×1

enums ×1

iterator ×1

ownership ×1