- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
std::mem::drop
的执行记录如下:
pub fn drop<T>(_x: T) { }
|_| ()
(俗称
toilet closure )是
drop
的潜在 1:1 替代品, 在两个方向。但是,下面的代码显示
drop
与函数参数上的更高等级特征不兼容,而厕所关闭是。
fn foo<F, T>(f: F, x: T)
where
for<'a> F: FnOnce(&'a T),
{
dbg!(f(&x));
}
fn main() {
foo(|_| (), "toilet closure"); // this compiles
foo(drop, "drop"); // this does not!
}
error[E0631]: type mismatch in function arguments
--> src/main.rs:10:5
|
1 | fn foo<F, T>(f: F, x: T)
| ---
2 | where
3 | for<'a> F: FnOnce(&'a T),
| ------------- required by this bound in `foo`
...
10 | foo(drop, "drop"); // this does not!
| ^^^
| |
| expected signature of `for<'a> fn(&'a _) -> _`
| found signature of `fn(_) -> _`
error[E0271]: type mismatch resolving `for<'a> <fn(_) {std::mem::drop::<_>} as std::ops::FnOnce<(&'a _,)>>::Output == ()`
--> src/main.rs:10:5
|
1 | fn foo<F, T>(f: F, x: T)
| ---
2 | where
3 | for<'a> F: FnOnce(&'a T),
| ------------- required by this bound in `foo`
...
10 | foo(drop, "drop"); // this does not!
| ^^^ expected bound lifetime parameter 'a, found concrete lifetime
drop
据说对于任何大小的
T
都是通用的,“更通用”的签名
fn(_) -> _
听起来不合理与
for<'a> fn (&'a _) -> _
不兼容.为什么编译器不承认
drop
的签名在这里,当马桶关闭代替它时,有什么不同?
最佳答案
问题的核心是drop
不是单个函数,而是一组参数化的函数,每个函数都删除某些特定类型。为了满足更高级别的特征绑定(bind)(以下称为 hrtb),您需要一个可以同时引用具有任何给定生命周期的类型的函数。
我们将使用 drop
作为我们泛型函数的典型示例,但所有这些也更普遍适用。以下是引用代码:fn drop<T>(_: T) {}
.
从概念上讲,drop
不是单个函数,而是每个可能类型的一个函数T
. drop
的任何特定实例只接受单一类型的参数。这称为 monomorphization .如果不同 T
与 drop
一起使用, drop
的不同版本被编译。这就是为什么您不能将泛型函数作为参数传递并完全通用地使用该函数(参见 this question )
另一方面,像 fn pass(x: &i32) -> &i32 {x}
这样的函数满足 hrtb for<'a> Fn(&'a i32) -> &'a i32
.不像 drop
,我们有一个函数同时满足 Fn(&'a i32) -> &'a i32
每一生'a
.这反射(reflect)在 pass
可以使用。
fn pass(x: &i32) -> &i32 {
x
}
fn two_uses<F>(f: F)
where
for<'a> F: Fn(&'a i32) -> &'a i32, // By the way, this can simply be written
// F: Fn(&i32) -> &i32 due to lifetime elision rules.
// That applies to your original example too.
{
{
// x has some lifetime 'a
let x = &22;
println!("{}", f(x));
// 'a ends around here
}
{
// y has some lifetime 'b
let y = &23;
println!("{}", f(y));
// 'b ends around here
}
// 'a and 'b are unrelated since they have no overlap
}
fn main() {
two_uses(pass);
}
'a
和
'b
彼此没有关系:两者都不完全包含对方。所以这里没有发生某种子类型化的事情。
pass
的单个实例确实被用于两个不同的、不相关的生命周期。
drop
不满足
for<'a> FnOnce(&'a T)
.
drop
的任何特定实例只能涵盖一个生命周期(忽略子类型)。如果我们通过
drop
进入
two_uses
从上面的例子中(有轻微的签名变化并假设编译器允许我们),它必须选择一些特定的生命周期
'a
和
drop
的实例在
two_uses
范围内将是
Fn(&'a i32)
一些具体的生命周期
'a
.由于该函数仅适用于单个生命周期
'a
,不可能在两个不相关的生命周期中使用它。
关于rust - 为什么 `std::mem::drop` 与高级特征边界中的闭包 |_|() 不完全相同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59023616/
在mutagen , 我正在注入(inject)各种代码中的突变。我想改变的一件事是模式 if let Ok(x) = y { .. } .然而,这构成了相当大的挑战,因为我不知道 y 的类型– 用户
在多处理器中,我们知道 lock inc mem :锁可以保证没有其他操作可以访问地址mem . 但是当一个处理器正在执行 mov eax,mem首先,然后在完成之前,第二个处理器执行 lock in
在通过 /metrics 端点公开的 Spring Boot 指标中,mem 和 mem.free 的含义是什么? 我们正在对部署在三个节点上的新 Spring Boot 微服务进行负载测试,每个盒子
我看了perf list的手册,找到了memory load/store的PMU事件定义: mem-loads OR cpu/mem-loads/ [Ke
Grub 是一个兼容多重引导的引导加载程序。当它启动操作系统时,它会创建一个定义可用内存的结构,并在内存中留下指向该结构的指针。 我在这里得到了这些信息: http://wiki.osdev.org/
我正在尝试实现 Wildfly 8.1.0。最终域设置,配置文件 full-ha,具有 1 个主服务器和 2 个从服务器,并通过 mod_cluster 进行负载平衡。 我的环境:1) VPS (Di
在 x86 上,如果 mem 是 32 位对齐的,那么 mov 操作保证是原子的。 如果 [mem] 不是 32 位对齐,可以 lock inc [mem]窗台工作正常吗? 工作正常:提供原子性而不是
基本上,我的问题是以下代码是否有效。 void* mem = operator new(sizeof(T)); T* instance = new(mem) T; delete instance; 如
int a[10]; int b[10]; memcmp(a, b, sizeof(int) * 10); memcmp() 只告诉我们哪个内存块更大/更小,因为它只返回 -1,0,+1。有没有一种方
fn main() { let k = "fire"; drop(k); println!("{:?}", k); } Playground 为什么删除后仍然可以使用k? dr
我有这个问题: let list = [(1,2);(2,3);(1,4);(5,0)];; List.mem (1,2) list;; - : bool = true 但是我需要修改这个函数,例如
我正在试验的问题与正确执行的 open() 或 mmap() 函数无关。我在内核中禁用了 CONFIG_STRICT_DEVMEM,所以我可以毫无问题地从 /dev/mem 中读取。实际上,我可以执行
如果我希望直接使用其他应用程序的虚拟地址访问数据,我可以使用虚拟地址访问 proc/[pid]/mem 吗?偏移量与虚拟地址相同吗? 从代码角度来看,如果我 fseeko(the-proc/[pid]
我正在开发 Raspberry PI (Linux rpi 3.12.28+),并且我有以下 C 代码,可用于操作 GPIO 端口: // IO Acces struct bcm2835_periph
我正在尝试为一个类(class)项目完成一个内存分配器的编写,这不是必要的作业,因为它没有被分配,我自己选择了这个项目。 我有两行标记为 #1 和 #2,两者都不起作用并给出不同的错误消息,以下是详细
这是我想写的代码: template class record : public record { using baseT = record; T1 elem; public: re
当使用这个表达式时: mem::size_of::() * 8 像这样: value % (mem::size_of::() * 8); value * (mem::size_of::() * 8);
我正在使用我的 Raspberry Pi,我正在编写一个 cgi python 脚本来创建一个网页来控制我的 gpio 输出引脚。当我尝试将 RPi.GPIO 导入为 GPIO 时,我的脚本崩溃了。这
我想控制对 dev/mem 的访问。 为了做到这一点,我正在考虑创建一个假的 dev/mem,以便进程访问它而不是实际的 dev/mem。 然后,我的进程将根据假进程中的更改修改 dev/mem。 这
我尝试打开/dev/mem。访问 /dev/mem 需要 root 权限才能打开该文件。 但是我无法在 super 用户中使用我的程序。所以我将/dev/mem访问权限更改为666(不要考虑安全问题!
我是一名优秀的程序员,十分优秀!