问题标签 [borrowing]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
343 浏览

rust - 你能在没有显式引用或所有权移动的情况下在结构上实现数学运算吗?

我不知道如何在不要求将这些结构值复制到任何地方的情况下对结构进行干净的数学运算。

如果你想拥有一个可以执行数学运算的结构,你会写这样的东西:

(这是一个简化的例子。一个实际的例子可能是做向量数学)

这让我们可以编写漂亮的a + (b / (c * d))样式代码。

由于借用语义,上述代码以a + b + a. 一旦a使用一次就不能再次使用,因为所有权已转移到相关功能(即add)。

解决这个问题的简单方法是Copy为结构实现:

这意味着当Nums 传递给时add,它们的值会自动克隆,以便可以干净地删除它们。

但这似乎效率低下!我们不需要在所有地方复制这些结构:它是只读的,我们真的只需要引用它来创建我们要返回的新结构。

这让我认为我们应该在引用上实现数学运算:

现在我们有了数学运算,我们不会到处克隆数据,但现在我们的数学看起来很糟糕!a + (b / (c * d))现在必须&a + &(&b / &(&c * &d))。如果您有值类型引用(例如 ),这也无济于事let a = &Num { /* ... */ },因为的返回值add仍然是 a Num

有没有一种干净的方法来实现结构的操作,使得数学运算看起来很干净,并且结构值不会被复制到任何地方?

有关的:

0 投票
1 回答
151 浏览

rust - 缓冲读取器的线路寿命不足会阻止拆分线路

我正在努力弄清楚 Rust 的借贷/终身/所有权属性。即,当使用缓冲读取器并尝试拆分行时。编码

或任何变化(有或没有指定变量类型,徒劳的尝试使其可变等)导致:

但试图假装延长寿命并通过切片从线路中获取一些数据

甚至只是尝试对split()未修改的行变量进行操作会导致:

“借来的价值不够长”似乎归咎于错误的事情表明生命周期持续足够长以将每个单词放入自己的字符串中,但是修改我在操场上的原始代码以包含嵌套的 for 循环仍然会导致

在参考line.unwrap()

最终,我在这里对 Rust 的生命周期或借用属性有什么误解?

0 投票
2 回答
179 浏览

rust - 借助 Rust 中的原始指针进行运行时借用管理是未定义的行为吗?

作为将 C API 绑定到 Rust 的一部分,我有一个可变引用ph: &mut Ph、一个结构struct EnsureValidContext<'a> { ph: &'a mut Ph }和一些方法:

我不控制这些。我只能用这些。

现在,如果您希望编译器强制您考虑性能(以及您必须在性能和您想要的行为之间做出的权衡。上下文验证很昂贵),那么闭包 API 非常好。但是,假设您只是不关心它并希望它正常工作。

我正在考虑制作一个为您处理它的包装器:

这将在必要时检查我们是 aPh还是 a Valid,如果我们是 a ,Ph我们将Valid通过以下方式升级到 a :

每种方法的降级都不同,因为它必须调用目标方法,但这里有一个示例close

你可以使用ValidPh类似的:

没有,vph您将不得不自己玩弄。虽然 Rust 编译器使这变得微不足道(只需遵循错误),但您可能希望让库为您自动处理它。否则,无论该操作是否可以使上下文无效,您最终可能只会为每个操作调用非常昂贵的操作。&mut PhEnsureValidContextwith_context

请注意,此代码是粗略的伪代码。我还没有编译或测试它。

有人可能会争辩说我需要一个UnsafeCell或一个RefCell或一些其他的Cell。但是,从阅读本文来看,由于内部可变性,它似乎UnsafeCell只是一个 lang 项目——只有当你通过一个 改变状态时才需要它,而在这种情况下,我一直都有。&T&mut T

但是,我的阅读可能有缺陷。此代码是否调用 UB?

(和的完整代码PhEnsureValidContext包括 FFI 位,可在此处获得。)

0 投票
1 回答
587 浏览

rust - 如何将生命周期设置为闭包中捕获的值?

我写了我认为很简单的代码:

我尝试在每个请求上发送一些指标,但我收到以下编译器错误:

我知道这client是在闭包中捕获的,并由另一个函数 ( main) 拥有,该函数的寿命可能少于闭包。我不能move这样做,因为Client没有实现Copy,所以以后不能使用引用。

我也明白我不能在闭包中借用可变数据(Client是可变的)。经过大量搜索,我可以得出结论我需要将Arc/RcMutex/ RwLock/结合使用RefCell,但在进一步之前,我想确定它是必需的。

0 投票
4 回答
2094 浏览

rust - 无法为返回引用的闭包推断适当的生命周期

考虑以下代码:

我的期望:

  • 类型 T 有生命周期'a
  • 价值t只要T.
  • t移动到闭包,所以闭包只要t
  • 闭包返回一个t被移动到闭包的引用。因此,只要闭包存在,引用就有效。
  • 没有生命周期问题,代码编译。

实际发生的情况:

  • 代码无法编译:

我不明白冲突。我该如何解决?

0 投票
1 回答
2543 浏览

reference - 我什么时候应该使用参考而不是转移所有权?

Rust 书中关于所有权的章节中,不可复制的值可以通过转移所有权或使用可变或不可变引用传递给函数。当您转移一个值的所有权时,它不能再在原始函数中使用:如果您愿意,您必须将其返回。当你传递一个引用时,你借用了这个值并且仍然可以使用它。

我来自默认情况下值不可变的语言(Haskell、Idris 等)。因此,我可能根本不会考虑使用引用。在两个地方具有相同的值对我来说看起来很危险(或者至少很尴尬)。由于引用是一项功能,因此必须有理由使用它们。

在某些情况下我应该强迫自己使用引用吗?这些情况是什么,为什么它们是有益的?还是他们只是为了方便而默认传递所有权是可以的?

0 投票
1 回答
2702 浏览

string - Rust 中的字符串相等:引用和取消引用如何工作?

作为一名 Rust 新手,我正在解决Project Euler问题,以帮助我了解这门语言。问题 4 涉及回文,我找到了两个用于创建回文向量的解决方案,但我不确定它们中的任何一个是如何工作的。

我正在使用一个字符串向量products,它是这样计算的:

为了将这些产品过滤到只有回文的产品,我有以下两种解决方案:

解决方案1:

解决方案2:

他们都产生了正确的结果,但我不知道为什么!

在解决方案 1 中,我们将字符串的引用与我们刚刚创建的字符串的引用进行比较?

在解决方案 2 中,我们取消引用对字符串的引用并将其与取消引用的新字符串进行比较?

我希望能够做到的事情:

我希望有人能够向我解释:

  • 我的两种解决方案有什么区别,为什么它们都有效?
  • 为什么我不能x在我的过滤器函数中不引用或取消引用它就使用它?

谢谢!

0 投票
0 回答
36 浏览

multithreading - 如何将 std::sync::RwLock 引用传递给多个线程?

我想以线程安全的方式让多个线程访问相同的数据结构。

我可以做到这一点,它说我的RwLock寿命不够长!我了解 Rust 的借贷,但这我无法理解。

编译器说

我似乎找不到任何这样做的例子。非常感谢任何想法或指示。

0 投票
2 回答
179 浏览

hashmap - 为什么 csv::Reader 记录中的字符串在插入 HashMap 时的寿命不够长?

我是 Rust 整个生命周期概念的新手。我正在尝试从 CSV 文件中读取一些数据并将它们放入HashMap

游乐场链接

但是会出现以下错误:

我认为插入HashMap转移所有权,因此记录也可以在循环之外使用。我在这里做错了什么?

0 投票
0 回答
37 浏览

rust - 为什么在可变函数的参数中不允许借用

标题可能有点混乱,我的意思是当我尝试编译时:

我收到此错误:

但是我想不出这是一个问题的原因,因为不应该先处理参数,usize复制结果值,然后reserve运行函数吗?

实际函数开始执行,何时计算函数的参数?

编辑:folder_file_path是一个Vec,并且compressed_data是一个HashMap