lifetime 相关问题

变量的生命周期是变量绑定到特定内存位置的时间。生命时间在分配变量时开始,在解除分配时结束。

特质中 self 的显式生命周期似乎会导致循环中“E0499 无法一次多次借用`*emitter`作为可变对象”

我遇到了一个问题,该特征可以返回对 self 中数据的引用。这是一个最小的示例案例: 特质 A { fn emit_symbol(&mut self) -> T; } fn via_an...

回答 1 投票 0

如何在结构体中填充缓冲区并同时显示它

Rust 开发人员您好, 我是 Rust 新手,我遇到了缓冲区使用寿命的问题。 我希望我的主程序负责填充结构和缓冲区。 我的结构必须填充 &q 中的缓冲区...

回答 1 投票 0

具有可变引用数组的结构

这是我的代码。最初的问题有更大的代码,但最后我将其压缩到下一个: 结构数据<'a> { f: [&'a mut [u8]; 2], } 隐含数据<'_> { fn new() -> ...

回答 1 投票 0

变量重新分配导致生命周期问题

我正在做沙沙声练习,我遇到了一些我不完全理解生命的事情。我将把代码简化为仅令人困惑的部分。 该函数编译正确:...

回答 1 投票 0

生命周期绑定会改变引用的类型吗?

我最近开始学习Rust,读完这本书后刚刚读完LifetimeKata。我觉得我什么都明白了,除了第九章的脑筋急转弯,它引用了这个

回答 1 投票 0

如何安全地将字符串及其切片移动到闭包中?

我正在尝试创建一个在字符串切片中移动的“静态闭包”,确切地说是一个 Vec<&str>。 我最初的尝试是这样的: fn 主() { 让句子=“Foo到酒吧&

回答 2 投票 0

如何安全地将字符串及其切片安全地移动到闭包中?

我正在尝试创建一个在字符串切片中移动的“静态闭包”,确切地说是一个 Vec<&str>。 我最初的尝试是这样的: fn 主() { 让句子=“Foo到酒吧&

回答 1 投票 0

只要我希望对象路径上的导出接口正常工作,我就必须让 DBus.Client.export 的调用者保持活动状态吗?

如果不是,是什么让我导出来实现接口的函数保持活动状态? 我正在 Haskell 中实现一个通知服务器,目前我有这样的东西, 启动服务器 :: IORef

回答 1 投票 0

一生摆脱封锁? [重复]

结构容器<'x> { 值:&'x i32, } impl<'x> 容器<'x> { fn f(&'x mut self) {} } fn 主() { 令 v = 1; 让 mut a = 容器{值: &v}; //...

回答 1 投票 0

了解铁锈寿命

尽管我觉得我清楚地了解了 Rust 的寿命,但我发现我的知识有差距。 总结一下,为什么此代码无效 结构令牌<'a> { 切片:&'a str, } 结构 WrappedT...

回答 1 投票 0

Rust:生命周期突破区块? [重复]

结构容器<'x> { 值:&'x i32, } impl<'x> 容器<'x> { fn f(&'x mut self) {} } fn 主() { 令 v = 1; 让 mut a = 容器{值: &v}; //...

回答 1 投票 0

在 Rust 中,可以将特征向下转换为拥有的类型吗?

在 Rust 中,我可以使用 .as_any().downcast_ref() 将特征对象向下转换为具体类型。这工作正常,但它返回一个 &ref,而不是拥有的对象本身。 我怎样才能获得

回答 1 投票 0

向量 split_once 方法的生命周期问题

我正在尝试实现一个文件行读取器,它不会进行太多的检查和分配来加速某些文件的读取。 这应该是有效的,但编译器抱怨借用了 self。

回答 1 投票 0

在 Rust 中返回结构变量的引用有什么缺点吗?

给出这个结构: 结构测试S { astr:字符串, } 实现测试S { pub fn new(s: String) -> Self { Self{ astr: s } } pub fn get_ref(&self) -> &String { &self.astr } p...

回答 1 投票 0

隐式生命周期类型和 memcpy 的“简单合格构造函数”的含义

假设您有一个可简单复制的类型,而不是聚合,并且不可简单构造: 结构体Foo { Foo() = 默认值; Foo(整数我) : 人工智能) {}; 整数a=5; }; 福不是...

回答 1 投票 0

借用和内部IntoIterator

虽然我对生命周期很聪明,但编译器再次教会了我...... 错误[E0521]:借用的数据在方法之外转义 玩 pub struct Bugger { 酒吧物品:S, } 实现

回答 1 投票 0

struct的两种实现有什么区别吗?

结构重要摘录<'a> { 部分:&'a str, } impl<'a> 重要摘录<'a> { fn 级别(&'a self) -> i32 { 3 } } 与 结构重要摘录<'a&...

回答 1 投票 0

特征的生命周期作为返回值

我想通过返回 impl 特征(如 create_trait() 中那样)来隐藏从 create 函数返回的实际实现。这怎么可能做到呢? 特质名称<'a> { fn 名字...

回答 3 投票 0

<'a, 'b: 'a>是否意味着生命周期“b”必须比生命周期“a”长?

我想实现一个类似于标准库定义的调试构建器的构建器。它们使用如下结构定义: 结构体 DebugFoo<'a, 'b: 'a> { fmt:&...

回答 3 投票 0

存储 std::format_args 时的生命周期问题

见以下代码: #包括 #包括 #包括 #包括 类异常_t : 公共 std:: 异常 { 民众: 模板 参见以下代码: #include <print> #include <exception> #include <string> #include <format> class exception_t : public std::exception { public: template<class... args_t> exception_t(std::string_view users_fmt, args_t&&... args) : m_users_fmt(users_fmt) , m_format_args(std::move(std::make_format_args(args...))) {} char const* what() const noexcept override { thread_local static std::string s = std::vformat(m_users_fmt, m_format_args); return s.c_str(); } private: std::string m_users_fmt; std::format_args m_format_args; }; int main() try { throw exception_t("{}", 42); } catch (std::exception& e) { std::println("{}", e.what()); } 在使用 SDK 10.0.19041.0 的 MSVC 2022 v143 下调试此问题时,我发现在构建 exception_t 期间,m_format_args 有一个适当的值,但在调用 What() 时,m_format_args 有一个无效值。这很可能是一生的问题,但我看不出出了什么问题。 (大多数情况下这个程序不打印 42) 我在这里做错了什么? ====================================================== HolyBlackCat回复后更新 上面是一个最小的代码片段,但其目的是将格式与异常/错误/警告报告完全分开。我想存储带有参数的标准类型,例如在磁盘上。随后另一个进程从磁盘读取数据并使用本地语言的格式字符串显示数据。这就是为什么我不想在此代码片段的构造函数中调用 std::vformat 的原因。 是否存在 std::format_args 的替代方案?例如。我可以存储参数吗? 我找到了一种存储参数并使程序运行的方法。我需要添加类型variant_t和variants_t并定义用户定义的格式化程序。那么上面的代码片段只需要一些小改动: #include <print> #include <exception> #include <string> #include <format> class exception_t : public std::exception { public: template<class... args_t> exception_t(std::string_view users_fmt, args_t&&... args) : m_users_fmt(users_fmt) , m_variants(args...) {} char const* what() const noexcept override { m_variants.resize(16, 0); thread_local static std::string s = std::vformat(m_users_fmt, std::make_format_args(m_variants[0], m_variants[1], m_variants[2], m_variants[3], m_variants[4], m_variants[5], m_variants[6], m_variants[7], m_variants[8], m_variants[9], m_variants[10], m_variants[11], m_variants[12], m_variants[13], m_variants[14], m_variants[15])); return s.c_str(); } private: std::string m_users_fmt; mutable variants_t m_variants; }; int main() try { throw exception_t("{}", 42); } catch (std::exception& e) { std::println("{}", e.what()); } 这并不完全理想: 参数数量限制为16个 what() 不再是可重入的(您对 const 函数的期望) variant_t、variants_t 和用户定义格式化程序的定义如下: #include <variant> #include <vector> using variant_t = std::variant < bool , char , int , unsigned int , long long , unsigned long long , float , double , long double , void const* >; // helper type for the visitor #4 template<class... Ts> struct overloaded : Ts... { using Ts::operator()...; }; template<> struct std::formatter<variant_t, char> { template<class parse_context_t> constexpr parse_context_t::iterator parse(parse_context_t& ctx) { for(auto it = ctx.begin(); it != ctx.end(); ++it) { m_format += *it; if (*it == '}') { return it; } } m_format += '}'; return ctx.end(); } template<class fmt_context_t> fmt_context_t::iterator format(variant_t const& variant, fmt_context_t& ctx) const { return std::visit(overloaded{ [&ctx, this](bool v) { return std::vformat_to(ctx.out(), m_format, std::make_format_args(v)); }, [&ctx, this](char v) { return std::vformat_to(ctx.out(), m_format, std::make_format_args(v)); }, [&ctx, this](int v) { return std::vformat_to(ctx.out(), m_format, std::make_format_args(v)); }, [&ctx, this](unsigned int v) { return std::vformat_to(ctx.out(), m_format, std::make_format_args(v)); }, [&ctx, this](long long v) { return std::vformat_to(ctx.out(), m_format, std::make_format_args(v)); }, [&ctx, this](unsigned long long v) { return std::vformat_to(ctx.out(), m_format, std::make_format_args(v)); }, [&ctx, this](float v) { return std::vformat_to(ctx.out(), m_format, std::make_format_args(v)); }, [&ctx, this](double v) { return std::vformat_to(ctx.out(), m_format, std::make_format_args(v)); }, [&ctx, this](long double v) { return std::vformat_to(ctx.out(), m_format, std::make_format_args(v)); }, [&ctx, this](void const* v) { return std::vformat_to(ctx.out(), m_format, std::make_format_args(v)); }, }, variant); } std::string m_format{"{:"}; }; class variants_t : public std::vector<variant_t> { public: constexpr variants_t() = default; template<class... args_t, class T> constexpr variants_t(T first_arg, args_t&&... args) { push_back(first_arg); variants_t v(args...); insert(end(), v.begin(), v.end()); } };

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.