gpt4 book ai didi

rust - 匹配: Deref and mark operator,为什么不一样?

转载 作者:行者123 更新时间:2023-11-29 08:05:12 26 4
gpt4 key购买 nike

这里是 example of usage Deref 的修改版本:

use std::ops::Deref;
use std::rc::Rc;

#[derive(Clone, PartialEq, Hash, PartialOrd, Eq, Ord)]
pub struct InternedString {
string: Rc<String>,
}

impl InternedString {
#[inline]
pub fn new(string: &'static str) -> InternedString {
InternedString {
string: Rc::new(string.to_owned()),
}
}
}

impl Deref for InternedString {
type Target = str;

fn deref(&self) -> &str { &self.string }
}


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);

match *x {
'a' => (),
_ => (),
};

let s = InternedString::new("aaa");
match *s {
"test" => (),
_ => (),
};
}

未编译,错误:

55 |         "test" => (),
| ^^^^^^ expected str, found reference
|
= note: expected type `str`
= note: found type `&'static str`

但是如果我手动调用deref方法:

match s.deref() {
"test" => (),
_ => (),
}

所有编译都没有错误,*ss.deref() 有什么区别,为什么 char 一切正常?

最佳答案

字 rune 字的类型是char,而字符串文字的类型是&'static str。请注意,字符串文字始终是引用,而字 rune 字不是引用。

*s 实际上被翻译成 *(s.deref()),而不是 s.deref(),当执行deref 强制转换,因为 deref 返回一个引用。因此,要将 InternedString 与字符串文字匹配,您需要引用 *s,即您需要编写 &*s而不是 *s。这是可行的,因为 *s 产生了一个左值。

关于rust - 匹配: Deref and mark operator,为什么不一样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42473807/

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