gpt4 book ai didi

rust - 为什么我必须显式转换为受约束的类型?

转载 作者:行者123 更新时间:2023-11-29 07:44:36 25 4
gpt4 key购买 nike

为什么下面注释掉的 bar 代码不能编译,即使 foobaz 可以编译?

use std::any::Any;
use std::fmt::Display;

// `value` implements `Clone`, so I can call `.clone()`.
fn foo<T: Display + Clone>(value: &T) {
println!("{}", value.clone());
}

// `value` implements `Any`, so I should be able to call `.downcast_ref`...
// But this doesn't compile!
//
// fn bar<T: Display + Any>(value: &T) {
// println!("{}", value.downcast_ref::<i32>());
// }

// For some reason I have to do an explicit cast to `&Any`...
fn baz<T: Display + Any>(value: &T) {
let value = value as &Any;
println!("{}", value.downcast_ref::<i32>().unwrap());
}

fn main() {
foo(&7);
// bar(&8);
baz(&9);
}

尝试编译 bar 会产生以下编译器错误:

error[E0599]: no method named `downcast_ref` found for type `&T` in the current scope
--> src/main.rs:13:30
|
13 | println!("{}", value.downcast_ref::<i32>());
| ^^^^^^^^^^^^

我已经阐明了 value 必须实现 Any 的约束,那么为什么我必须进行显式转换?

最佳答案

那是因为downcast_ref不是特征本身的一部分。如果我们看一下特征的定义 in the documentation :

pub trait Any: 'static {
fn get_type_id(&self) -> TypeId;
}

我们可以看到 downcast_ref 不存在。只有定义为特征成员的方法才能在实现该特征的类型上可用。

相反,downcast_refimpl Any + 'static block 1 中。由于该方法采用 &self,这意味着该方法仅适用于 &(Any + 'static) 类型的值(&Any 没有生命周期specified 等同于 &(Any + 'static))。 &Any&T (其中 T 是类型参数)不是同一类型; &Any 是一个特征对象(它是一个胖指针),而 &T 只是一个普通引用(它是一个瘦指针)。


1 它也在 impl Any + 'static + Send block 中定义,因此该方法也可用于 &(Any + '静态 + 发送)

关于rust - 为什么我必须显式转换为受约束的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46045298/

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