首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么在Box<dyn Any>中存储&str并将其向下转换为&Box<&str>总是没有结果?

在Box<dyn Any>中存储&str并将其向下转换为&Box<&str>没有结果的原因是,&str是一个固定大小的引用类型,而Box<&str>是一个堆分配的动态大小类型。Box<dyn Any>是一个用于存储不同类型的trait对象的泛型类型,它可以存储不同大小和类型的值。但是,由于&str和Box<&str>的大小和类型不同,无法直接进行向下转换。

在Rust中,&str是一个指向字符串切片的引用,它的大小是固定的,而Box<&str>是一个指向堆上分配的字符串切片的引用的Box指针,它的大小是动态的。因此,无法将&str直接转换为Box<&str>。

如果想要在Box<dyn Any>中存储&str并进行向下转换,可以使用Box<str>来代替&str。Box<str>是一个堆分配的字符串类型,它的大小是动态的,可以存储在Box<dyn Any>中,并进行向下转换为&Box<str>。

以下是一个示例代码:

代码语言:txt
复制
use std::any::Any;
use std::boxed::Box;

fn main() {
    let value: Box<dyn Any> = Box::new("Hello, World!".to_string());
    
    if let Some(string) = value.downcast_ref::<Box<str>>() {
        println!("{}", string);
    } else {
        println!("Failed to downcast to Box<str>");
    }
}

在上述代码中,我们将字符串"Hello, World!"转换为Box<dyn Any>类型的值,并尝试将其向下转换为Box<str>类型。如果转换成功,我们将打印字符串的内容;否则,我们将打印转换失败的消息。

请注意,以上示例中没有提及腾讯云相关产品和产品介绍链接地址,因为这些内容与问题的答案无关。如果您需要了解腾讯云的相关产品和服务,请参考腾讯云官方文档或咨询腾讯云的技术支持。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【翻译】Rust生命周期常见误区

, num_ref); // 编译通过 } 要点 Rust的函数生命周期省略规则并不总是对所有情况都正确的 Rust对你的程序的语义了解并不比你多 给你的生命周期标记起一个更有描述性的名字 在你使用显式生命周期标记的时候要想清楚它们应该被用在哪以及为什么要这么用...use std::cell::Ref; trait Trait {} // 省略 type T1 = Box; // 展开,Box对T没有生命周期约束,所以被推断为'static...("{}", t); }).join(); } 编译通过,但这两个函数放在一块儿看起来有点怪,为什么第二个函数对 T 有 'static 约束,而第一个没有?这个问题很刁钻。...Rust编译器的眼中是这样的: use std::fmt::Display; fn dynamic_thread_print(t: Box...一开始我也不太确定,但不幸的是, 经过一段时间的研究之后我发现它们在实践确实存在着区别。

1.5K20

【Rust每周一知】理解智能指针Box

Rust的指针是“第一类公民”(first-class values),可以将它们移动或复制,存储到数据结构并从函数返回。...Rust,引用和智能指针的一个的区别是引用是一类只借用数据的指针;相反,大部分情况下,智能指针拥有他们指向的数据。...Rust标准库不同的智能指针提供了比引用更丰富的功能: Box,用于堆上分配数据。 Rc,一个引用计数类型,其数据可以有多个所有者。...智能指针Box Rust,所有值默认都是栈上分配。通过创建Box,可以把值装箱,使它在堆上分配。...为什么呢?由于self是一个&Box,因此对其进行一次解引用*将获得一个Box,而第二次解引用*将获得一个T。最后,将其包装在引用&返回。

2.1K10

rust智能指针

因此不要仅仅因为堆上性能不如栈这个印象,就总是优先选择栈,导致代码更复杂的实现。 Box的使用场景 由于 Box 是简单的封装,除了将值存储堆上外,并没有其它性能上的损耗。...特征对象,用于说明对象实现了一个特征,而不是某个特定的类型(特征对象的时候,我们已经见到过了Box) 使用 Box 将数据存储堆上 前面的文章,我们提到过,标量数据类型是被存储栈上的。...现在我们使用Box将其存储堆上。例如: fn main() { let num = Box::new(1); println!..., world"); Box::leak(s.into_boxed_str()) } 之前的代码,如果 String 创建于函数,那么返回它的唯一方法就是转移所有权给调用者 fn move_str...("{}",s); } 这里我们使用了之前自定义的智能指针 MyBox,并将其通过连续的隐式转换变成 &str 类型:首先 MyBox 被 Deref 成 String 类型,结果并不能满足 display

1.1K30

nydusd 源码理解(二)

Rust ,应尽可能避免使用全局变量。取而代之,尽早创建对象(比如在 main 函数),然后将对该对象的可变引用传递到需要它的位置。 lazy_static!...Poll::new() 会新建 Selector 实例,Selector 创建的时候会创建 epoll,返回值存储 Selector 实例: Selector示例存储Poll.registry.selector...: Waker::new(poller.registry(), Token(1)) 会注册 waker,创建 sys::Waker 实例。...; HttpServer(dbs-uhttp[3] 的结构体)创建实例时会绑定 socket,将 socket 设置为 nonblocking 模式,返回 HttpServer 实例: pub...API Server Handler 线程启动成功后,将两个线程存储 ApiServerController 的实例: self.waker = Some(waker); self.http_handler_thread

98300

Python|进制转换

问题描述 输入一组M进制数的整数,将其换为L进制后,统计其中的最大值和最小值输出。...输入说明:第一行是整数N、M和L, N表示这组数的个数, M表示输入数字的进制(可能是2, 8, 10) , 将其换为L进制(可能是2, 8, 10) 输出说明:转换后的L进制数的最大值和最小值,中间用空格隔开...但这个字符串包含额三个值所以要用split把字符串切片split的用法可以看我的另外一篇博客 3 对应进制的处理: 因为不同的M,L对应的进制转化不同,所以我们定义一个函数来处理不同的ML情况下的进制转换,由十进制其他进制或其他进制十进制都有相关内置函数...其他进制可以先转为十进制再其他进制 4 最大值处理: 把转化好的数放入一个列表 用max函数输出最大值 5 输出处理: 因为进制内置函数转换后会有前缀 所以可以把他转成字符串输出前缀后面的数 Python...(i)x,y=jinzhi(max(box)),jinzhi(min(box))print(str(x)[2:],str(y)[2:]) END 实习编辑 | 王楠岚 责 编

68220

Java 泛型

也就是 集合第二个数据是 Integer,但是我们取出来的时候将其换为 String 了,所以报错。   那么这个如何解决呢?   ①、我们遍历的时候,根据每个数据的类型判断,然后进行强。...那么我们说这个集合只有两条数据,我们可以进行判断强,如果数据有成千上万条呢,我们都通过这样判断强肯定不可取   ②、往集合中加入数据的时候,我们就做好限制,比如这个集合只能添加 String 类型的...结论:Java 泛型只在编译阶段有效,即在编译过程,程序会正确的检验泛型结果。...  输出结果为: 1 T的实际类型为:java.lang.Integer Tom T的实际类型为:java.lang.String 3.4 泛型通配符 泛型,我们可以用 ?...,即使你存入基本类型的,Java还是会通过自动拆箱和自动装箱机制将其换为引用类型 4.2、如果使用 ?

1.6K100

Rust的一些标准库

("b = {}", b); } Box 没有运行上的性能损失,虽然如此,但它却只以下场景中比起默认的栈上分配更适用: 当有一个在编译时未知大小的类型,而又想要在需要确切大小的上下文中使用这个类型值的时候...::Cons(2, Box::new(List::Nil)))))); } 场景2代码示例: // 场景2:当有大量数据希望确保数据不被拷贝的情况下转移所有权的时候 fn example2() {...是字符串字面量, 它直接存储二进制文件. 我们无法直接操作这些数据, // 必须借由 &str, 即它的引用来与之交互. 由于 "Hello World!"...str存储在内存的 // 字符串数据. 这里的内存可以是栈, 可以是堆, 也可以是数据段(二进制文件). &str 是对 str // 的引用....,那么请使用 &str 如果你定义一个结构体,结构体包含一个字符串成员,那么使用 String 是更好的选择 ---- Rust的系统时间SystemTime 程序处理时间是一个常见的需求,我们来看下如何在

89320

【Rust 基础篇】Rust Trait 对象:灵活抽象与动态分发

为什么需要 Trait 对象? Rust ,泛型是一种强大的工具,可以实现静态分发。通过泛型,我们可以在编译时确定类型并进行优化。...但是,某些情况下,我们需要在运行时处理不同类型的对象,根据对象的具体类型调用相应的方法。这时候 Trait 对象就发挥了作用。 Trait 对象允许我们在运行时处理不同类型的对象,实现动态分发。...使用 Trait 对象 要使用 Trait 对象,我们需要先将具体类型的对象转换为 Trait 对象。这可以通过 &dyn Trait 或 Box 来实现。...Trait 对象的调用会带来一定的运行时开销,因为需要在 VTable 查找方法的地址;而泛型的调用是直接内联的,没有额外的开销。...Trait 对象的调用会带来一定的运行时开销,因为需要在 VTable 查找方法的地址。 Trait 对象只能用于对象的引用或 Box,不能直接存储具体类型的对象。

42810

让我们来构建一个浏览器引擎吧

它使用了第一部分的DOM数据结构。 解析器将其输入字符串和当前位置存储字符串。位置是我们还没有处理的下一个字符的索引。...一些格式不正确的输入,如###或*foo*将成功解析产生奇怪的结果。真正的CSS解析器会丢弃这些无效的选择器。 优先级 优先级是渲染引擎冲突决定哪一种样式覆盖另一种样式的方法之一。...如果存在该属性,则将其从CSS解析器传递给parse_declarations。普通的作者声明之后应用结果声明,因为属性比任何CSS选择器都更特定。...这意味着我们的代码计算宽度时需要自顶向下遍历树,因此它可以父类的宽度已知之后布局子类,自底向上遍历以计算高度,因此父类的高度在其子类的高度之后计算。...结果是水平框尺寸的使用值,我们将把它存储布局树。你可以layout.rs中看到最终的代码。 定位 下一步比较简单。

1.2K40

透过 Rust 探索系统的本原:泛型

() } fn main() { generic::(42); generic::(&"hello"); } main() 对 generic() 的两次调用,第一次使用了... Rust 里,这种类型叫 Trait Object,表现为 &dyn Trait 或者 Box。这里,dyn 关键字仅仅是用来帮助更好地区分普通类型和 Trait 类型。...于是,上述代码可以写成: pub fn format(input: &mut str, formatters: Vec>) { for formatter...右边是 Alexander Stepanov 为 C++ STL 初版设计的类似算法(之所以叫 lower_bound,是因为它不仅使用 binary search 返回匹配的结果没找到时,还会返回其应该所处的位置...这也意味着,即便 Rust 很多场合能够取代 C,但 Rust 可能永远也无法取代 C 操作系统应用程序二进制接口 (ABI)的地位。

1.1K40
领券