- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
为什么会出现这种情况?我是 Rust 的新手,阅读了第 2 版书,但是......好吧,是的,我在这里。 :)
fn main() {
Xyz::new(&"whatever=123");
}
pub struct Xyz<'a> {
x: &'a str
}
impl<'a> Xyz<'a> {
pub fn new(query: &str) -> Result<Xyz<'a>, &'a str> {
let mut qkey: String = String::new();
let mut qval: String = String::new();
let mut is_key = true;
for (i, c) in query.chars().enumerate().skip(1) {
if c == '=' {
is_key = false;
} else if c == '&' {
is_key = true;
} else if is_key {
qkey.push(c);
} else {
qval.push(c);
}
if c == '&' || i == query.len() - 1 {
match qkey.as_ref() {
"whatever" => {
let _whatever = Xyz::some_func(&mut qval)?;
}
_ => (),
}
qkey.clear();
qval.clear();
}
}
Ok(Xyz {
x: &""
})
}
fn some_func(_val: &mut String) -> Result<bool, &str> {
Ok(true)
}
}
错误:
error[E0597]: `qval` does not live long enough
--> src/main.rs:29:61
|
29 | let _whatever = Xyz::some_func(&mut qval)?;
| ^^^^ borrowed value does not live long enough
...
41 | }
| - borrowed value only lives until here
|
note: borrowed value must be valid for the lifetime 'a as defined on the impl at 9:1...
--> src/main.rs:9:1
|
9 | impl<'a> Xyz<'a> {
| ^^^^^^^^^^^^^^^^
我不明白为什么会发生实际错误。我知道该说明应该可以帮助我理解问题,但事实并非如此。
在这个函数之外我不需要qval
,那么为什么我还要保留它呢?我犯了概念性错误吗?
最佳答案
您问题的缩减复制是
pub struct Xyz<'a> {
x: &'a str
}
impl<'a> Xyz<'a> {
pub fn new(_query: &str) -> Result<Xyz<'a>, &'a str> {
let qval: String = String::new();
Err(&qval)
}
}
错误
error[E0597]: `qval` does not live long enough
--> src/main.rs:13:18
|
13 | Err(&qval)
| ^^^^ borrowed value does not live long enough
14 | }
| - borrowed value only lives until here
要理解这一点,我建议退后一步,想想您的函数到底在做什么。您创建一个 String
,然后引用它,然后返回该引用。
这将是 use-after-free 的经典案例.从语言的角度来看,该字符串已不存在,因此返回对它的引用没有意义。
返回 &str
可以有意义,但前提是您可以保证 &str
只会引用仍在范围内的数据,即使在函数返回之后也是如此。例如,执行 Err(&query)
是有效的(或 query
的任何小节)如果您将函数调整为 fn new(query: &'a str) ->
,从那时起就知道返回值与输入字符串一样长。
很难从您的示例中判断这对于用例是否可以接受。
最简单确实是返回一个String
(或在您的情况下为 Result<Xyz<'a>, String>>
,也可能在 String
的字段中带有 Xyz
)。您还可以考虑返回类似 Cow 的内容这是有时 query
的一个小节或静态字符串,有时 String
.
作为旁注,我还要添加 Xyz::new(&"whatever=123");
不需要 &
因为它已经是一个引用。你可以做
Xyz::new("whatever=123");
就好了。同样适用于 &""
.
My confusion was that - in the not stripped down version - both function (
new
andsome_func
returned a global&'static str
asErr
, so I thought the compiler would know that the string would always exist.
这可能是误解的核心。当你声明
fn some_func(_val: &mut String) -> Result<bool, &str> {
&str
不是 'static
.使用rust 的 lifetime elision逻辑意味着这个声明将假定函数参数中的引用和返回值中的引用具有相同的生命周期,这意味着你声明的是
fn some_func<'b>(_val: &'b mut String) -> Result<bool, &'b str> {
这会触发您看到的错误。如果你希望它是静态的,你需要这样说,因为
fn some_func(_val: &mut String) -> Result<bool, &'static str> {
这将避免错误,并要求 some_func
总是返回 'static
字符串。
关于rust - 为什么我在函数外部不需要的值会出现 "Borrowed value does not live long enough"错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49909018/
我在使用 jquery 1.9.1 时遇到问题。我已经搜索过,但这些都没有解决我的问题。 $('.sm2_expander').live('click', function() { $
有些 Live CD 可以启动操作系统并允许您无需安装即可使用它。 我想知道是否有一种简单的方法来自定义 Live CD,以便它只加载运行一个应用程序所需的内容,然后运行该应用程序。 最佳答案 对于
当我从 Live CD 启动 Linux Mint 时,我能够将文件保存到“文件系统”。但这些文件保存在哪里呢?不可能是光盘,因为它是 CDR。我不认为它存储在 RAM 中,因为它只能保存这么多数据,
我正在尝试 ZIO . 我不明白为什么要添加Live作为Trait,然后提供一个object,比如: object Live extends Live 在不同的地方可以找到这种模式,例如 zio.co
我正在尝试播放 RTSP 直播流媒体网址“rtsp://164.100.51.207/broadcast/DDLive”。但我收到此错误 (1,-1)。 我正在尝试这段代码 VideoView myV
如何更改标签的 html,如下所示: $('#someId').html('foo bar'); 使用 live() 或 delegate() 函数时?只是为了澄清,我不希望这种情况发生在悬停、焦点或
我在这里没有看到很多关于 Microsoft 提供的 xbox live api 的帖子。谁能给我指一个有活跃的 xbox live api 社区的网站? 最佳答案 这是相当模糊的,所以我会提供一个广
我有一个带有 class="centerMessage" 的 div 。该 div 会在页面加载后的某个时刻插入到 DOM 中。我想更改此 div 上的 CSS 以使其居中。我尝试了下面的CSS功能,
我正在开发一个应用程序,我需要将通过智能手机的摄像机(在 iPhone 和 Android 手机上)捕获的视频流式传输直接到 YouTube Live。 我研究了 Codename One 的 Cap
当使用 DLT 时,我们可以使用 STREAMING LIVE TABLE 或 LIVE TABLE 创建一个实时表,如文档中所写: CREATE OR REFRESH { STREAMING LIV
所以,我在一个网站上工作,我希望用户能够使用他们的 xbox 帐户登录,将他们的玩家标签链接到我的网站。我可以像这样使用 oauth: 但是,我不知道如何获得 xbox live 权限。执行此操作的其
我正在使用苹果的 http 实时流媒体将实时视频流式传输到 ipad/iphone。其中一个重要的步骤是将传输流与播放列表一起分割成几个 ts 段。根据苹果的文档,推荐的 ts 段持续时间为 10 秒
我正在尝试实现“使用 Outlook.com 登录”流程,其中涉及客户端和服务器代码。 流程是: 从客户端将用户重定向到: https://login.live.com/oauth20_authori
如果您使用 YouTube 直播打开广播“事件”,用户可以使用回放功能,让他们无需离开界面即可观看过去 3 小时的广播 - 您可以像观看视频一样轻松观看,但您仍处于广播中,您只需控制过去缓冲的分钟数。
我有一个使用 HTTP Live Streaming 传送视频内容的应用程序。我希望应用程序根据设备屏幕尺寸(4x3 或 16x9)检索适当的分辨率。我运行 Apple 的工具来创建主 .m3u8 播
我有一个使用 HTTP Live Streaming 传送视频内容的应用程序。我希望应用程序根据设备屏幕尺寸(4x3 或 16x9)检索适当的分辨率。我运行 Apple 的工具来创建主 .m3u8 播
super 快的。这是我的 .gitignore(在我的 repo 的根级别 # Makefile stuff LIVE-* .install-post-all 当我这样做时,LIVE-* 位不起作用
因此,我在 Gamasutra 阅读了 John Carmack 的采访,其中他谈到了他所谓的“存在于内存映射文件中的实时 C++ 对象”。以下是一些引用: JC: Yeah. And I actua
在教师端对类(class)进行更改后,有预览更改和查看实时版本的选项,但目前这两个选项都无法正常工作,我们必须在 URL 中附加基本 url (www.abc.com/)是时候预览更改或查看实时版本了
有人可以详细说明aria-live="assertive"之间的区别吗?和 aria-live="polite" ? 据我了解 aria-live="assertive"将获得更高的优先级并清除队列,
我是一名优秀的程序员,十分优秀!