- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在编写代码以适应 Rust 时,我偶然发现了一个编译器错误。我想了解为什么会收到错误以及如何处理:
cannot infer an appropriate lifetime for lifetime parameter in generic type due to conflicting requirements
我一直在查看很多涵盖类似错误的问题,但大多数问题似乎都与循环依赖有关,我认为这不是这里发生的事情。
这是我对 MWE 的尝试,它仍然可以进一步简化:
Playground link (略有不同的错误信息)
pub struct InnerMut<T> {
state: u32,
stored_fn: fn(&mut T, u32),
}
impl<T> InnerMut<T> {
pub fn new(stored_fn: fn(&mut T, u32)) -> InnerMut<T> {
return InnerMut {
state: std::u32::MAX,
stored_fn,
};
}
pub fn mutate(&mut self, data: &mut T) {
(self.stored_fn)(data, self.state);
self.state -= 1;
}
}
pub struct StoreFnMut<F>
where
F: FnMut(&mut [u8]),
{
mutable_closure: F,
}
impl<F> StoreFnMut<F>
where
F: FnMut(&mut [u8]),
{
pub fn new(mutable_closure: F) -> StoreFnMut<F> {
StoreFnMut { mutable_closure }
}
fn run_closure_on_mutable_borrow(&mut self) {
let mut buf = vec![0; 100];
(self.mutable_closure)(&mut buf[..]);
}
}
fn foo(borrow: &mut &mut [u8], val: u32) {
borrow[0] = (val & 0xff) as u8;
}
fn main() {
let mut capturing_closure;
let mut store_fn_mut;
let mut inner_mut;
inner_mut = InnerMut::new(foo);
capturing_closure = move |mut borrow: &mut [u8]| {
inner_mut.mutate(&mut borrow);
};
store_fn_mut = StoreFnMut::new(capturing_closure);
store_fn_mut.run_closure_on_mutable_borrow();
}
在使用 Rust 1.24.1 进行编译时,我收到了这条看似有用但令人困惑的错误消息:
error[E0495]: cannot infer an appropriate lifetime for lifetime parameter in generic type due to conflicting requirements
--> src/main.rs:48:31
|
48 | inner_mut = InnerMut::new(foo);
| ^^^
|
note: first, the lifetime cannot outlive the anonymous lifetime #1 defined on the body at 49:25...
--> src/main.rs:49:25
|
49 | capturing_closure = move |mut borrow: &mut [u8]| {
| _________________________^
50 | | inner_mut.mutate(&mut borrow);
51 | | };
| |_____^
note: ...so that expression is assignable (expected &mut &mut [u8], found &mut &mut [u8])
--> src/main.rs:50:26
|
50 | inner_mut.mutate(&mut borrow);
| ^^^^^^^^^^^
note: but, the lifetime must be valid for the block suffix following statement 2 at 46:5...
--> src/main.rs:46:5
|
46 | / let mut inner_mut;
47 | |
48 | | inner_mut = InnerMut::new(foo);
49 | | capturing_closure = move |mut borrow: &mut [u8]| {
... |
53 | | store_fn_mut.run_closure_on_mutable_borrow();
54 | | }
| |_^
note: ...so that variable is valid at time of its declaration
--> src/main.rs:46:9
|
46 | let mut inner_mut;
| ^^^^^^^^^^^^^
最佳答案
我想不出 &mut &mut _
的用例。
如果将 foo
更改为
fn foo(borrow: &mut [u8], val: u32);
然后你得到另一个错误:
error[E0277]: the trait bound `[u8]: std::marker::Sized` is not satisfied
--> src/main.rs:46:25
|
46 | let mut inner_mut = InnerMut::new(foo);
| ^^^^^^^^^^^^^ `[u8]` does not have a constant size known at compile-time
|
= help: the trait `std::marker::Sized` is not implemented for `[u8]`
note: required by `<InnerMut<T>>::new`
好吧,在这段代码中没有什么需要 T
是 Sized
因为它只用在引用中,所以让我们添加约束 T: ?Sized
:
pub struct InnerMut<T: ?Sized> {
state: u32,
stored_fn: fn(&mut T, u32),
}
impl<T: ?Sized> InnerMut<T> {
// …
}
关于rust - 为什么在使用嵌套可变引用时会出现错误 "cannot infer an appropriate lifetime for lifetime parameter in generic type"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49928840/
我使用 Facebook 的 Infer 检查我的 android 代码 infer -- ./gradlew build after 8 minutes Fatal error: exception
来自 JEP 286 ,我们看到我们将能够在 JDK 10 (18.3) 中利用本地类型推断 (var)。 JEP 声明以下编译,这是预期的: var list = new ArrayList();
我可以拥有 val composeFunction = remember { mutableStateOf ({}) } 我可以拥有 val composeFF = @Composable { Tex
我真的不知道如何解决这个问题(错误:不兼容的类型:推断的类型不符合推断的上限:INT#1 上限:Giocatore[],Parcelable where INT# 1 是交集类型:INT#1 exte
直到今天,在我们将 Visual Studio 2017 更新到最新的 15.3 之后,我们的 UWP 应用程序中的以下代码一直运行良好。 private void Test() { var
我有以下代码,我不明白: type Msg = Left | Right content : Html Msg content = p [] [] p的类型签名: p : List (
类型推断的局限性是什么?哪些类型的系统没有通用的推理算法? 最佳答案 Joe Wells表明系统F的类型推断是不确定的,System F是最基本的多态Lambda演算,由Girard和Reynolds
我在构建时不断收到以下错误 Karma 运行失败:未定义 ERROR [karma]: ReferenceError: Strict mode forbids implicit creation of
在编程语言中,推断类型和动态类型有什么区别?我知道动态类型,但不知道动态类型与推断类型有何不同?有人可以通过一些例子提供解释吗? 最佳答案 推断类型 = 在编译时设置一次。实际上,推断部分只是为了节省
我有一个类: class MyClass{ enum Choices : int { First, Last }; template
考虑下面的类 class SomeBaseClass { ... } 以及以下使用infer关键字的条件类型 type ExtractInner = T extends SomeBaseCla
这个问题在这里已经有了答案: In TypeScript, how to get the keys of an object type whose values are of a given typ
例如,Agda 允许我这样写: open import Data.Vec open import Data.Nat myVec : Vec ℕ _ myVec = 0 ∷ 1 ∷ 2 ∷ 3 ∷ []
我正在使用: $ coqtop -v The Coq Proof Assistant, version 8.4pl5 (February 2015) compiled on Feb 06 2015 1
我知道像 Haskell 这样的语言是静态类型的并且有类型推断。但是是否存在具有全局类型推断的非函数式语言,相当于具有类型推断和结构类型的 C 之类的东西。 最佳答案 OCaml 是我所知道的唯一一种
鉴于: sub abc(Int $n) { say $n } 如果我们将类型为Str的变量传递给abc,则会得到编译时错误: my Str $s = "123"; abc $s; 如果传递包含字符
序言:这是基于@Travis Brown 的 macro based solution复制案例类属性。 鉴于: trait Entity[E def id: Int def withId(i
为什么可以推断闭包表达式的参数类型和返回类型,而不是 Rust 中的函数? 最佳答案 这只是一个设计决定:Rust 使用局部类型推断,而不是全局类型推断。理论上可以进行全局类型推断,但为了便于调试,R
我想使用的类是 System.Web.Mvc.DependencyResolver。以下作品: using System.Web.Mvc; ... var x = DependencyResolver
我声明了以下字典: private readonly Dictionary dictionary; 我有一个导致编译器错误的方法: public IQueryable Find(Func ex
我是一名优秀的程序员,十分优秀!