【问题标题】:About trait Index implement of Vector in Rust [duplicate]关于 Rust 中 Vector 的 trait Index 实现 [重复]
【发布时间】:2018-08-02 14:19:47
【问题描述】:

我在 doc 中检查 Index trait 并发现 index() 的返回类型是 &T

然后我写这个函数来从向量中获取值:

fn get_value_test(a: usize, v: &Vec<i32>) -> i32 {
    v[a]
}

我的问题是:为什么v[a]i32&amp;i32?因为i32...have a known size at compile time are stored entirely on the stack, so copies of the actual values are quick to make? (来自here

在这种情况下,Rust 似乎有转换类型的隐藏规则?

【问题讨论】:

标签: rust


【解决方案1】:

这里有一个小错误。虽然Index&lt;Idx&gt; 的方法原型是fn index(&amp;self, index: Idx) -&gt; &amp;T,但语法运算符x[i] 确实取消引用&amp;T 的输出:

container[index] 实际上是*container.index(index) [...] 的语法糖。如果value 的类型实现Copy,这将允许诸如let value = v[index] 之类的好东西。

所以你去。您的函数确实是从向量返回值的副本,而不是从隐式转换中返回。如果最初的意图是真正检索对该值的引用,您可以使用&amp;x[i]

另见:

【讨论】:

  • 谢谢。学 Rust 很有趣。
  • 另外值得一提的是,这允许&amp;x[i] 引用向量中的值,否则它必须将值移出向量,然后引用移动的值将是行不通的。
  • @ccQpein:老实说,这确实是一个肮脏的黑客行为。问题是您真的希望能够在生命周期内参数化 Output 的关联类型 Index,允许用户决定是否返回引用,但这还不可能。因此,出于人体工程学的原因,我们采用了这种奇怪的技巧。你可能已经猜到了,我不是粉丝:x
  • @MatthieuM。我想你的意思是 ping @loganfsmyth?
  • @E_net4: 不,我的意思是 ping OP :) 我不觉得这个黑客“有趣”,它对我来说是个疣。
猜你喜欢
  • 1970-01-01
  • 2017-11-03
  • 1970-01-01
  • 1970-01-01
  • 2023-03-06
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多