gpt4 book ai didi

pointers - 为什么断言 Deref::deref 的结果会因类型不匹配而失败?

转载 作者:行者123 更新时间:2023-11-29 07:42:50 24 4
gpt4 key购买 nike

下面是Deref example from The Rust Programming Language除了我添加了另一个断言。

为什么 assert_eqderef 也等于 'a'?为什么在手动调用 deref 后还需要 *

use std::ops::Deref;

struct DerefExample<T> {
value: T,
}

impl<T> Deref for DerefExample<T> {
type Target = T;

fn deref(&self) -> &T {
&self.value
}
}

fn main() {
let x = DerefExample { value: 'a' };
assert_eq!('a', *x.deref()); // this is true
// assert_eq!('a', x.deref()); // this is a compile error
assert_eq!('a', *x); // this is also true
println!("ok");
}

如果我取消注释该行,我会得到这个错误:

error[E0308]: mismatched types
--> src/main.rs:18:5
|
18 | assert_eq!('a', x.deref());
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected char, found &char
|
= note: expected type `char`
found type `&char`
= help: here are some functions which might fulfill your needs:
- .to_ascii_lowercase()
- .to_ascii_uppercase()
= note: this error originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info)

最佳答案

首先,让我们为您的特定示例阐明通用类型:'a'char ,所以我们有:

impl Deref for DerefExample<char> {
type Target = char;

fn deref(&self) -> &char {
&self.value
}
}

值得注意的是,deref 的返回类型是对 char引用 .因此,当您仅使用 x.deref() 时,也就不足为奇了。 , 结果是 &char而不是 char .记住,那时候deref只是另一种普通方法 — 它只是作为某些语言提供的特殊语法的部分 隐式调用。 *x ,例如,将调用 deref并在适用时取消引用结果。 x.char_method()fn_taking_char(&x)还将调用 deref一些次数,然后对结果做进一步的处理。

为什么 deref返回引用开始,你问?不是圆形的吗?好吧,不,它不是循环的:它减少库定义的智能指针指向内置类型 &T编译器已经知道如何取消引用。通过返回一个引用而不是一个值,您可以避免复制/移动(这可能并不总是可能的!)并允许 &*x (或 &x 当它被强制时)引用实际 charDerefExample保留而不是临时副本。

另见:

关于pointers - 为什么断言 Deref::deref 的结果会因类型不匹配而失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30566481/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com