我在一些我认为应该可以工作的东西中遇到了一些编译错误,

fn function() -> bool {
    unsafe { 1 } == 1
}

这会给我带来这个错误

error: expected expression, found `==`
 --> src/main.rs:9:18
  |
9 |     unsafe { 1 } == 1
  |                  ^^ expected expression

error[E0308]: mismatched types
 --> src/main.rs:9:14
  |
9 |     unsafe { 1 } == 1
  |              ^ expected `()`, found integer

For more information about this error, try `rustc --explain E0308`.
error: could not compile `testcon` due to 2 previous errors

我知道这有点没用,但那1真的是一个不安全的函数. 但话说回来,这一切都运行得很好.

fn function() -> bool {
    let var = unsafe { 1 };
    var == 1
}

我知道也许两者都会被优化为完全相同,但我很好奇为什么

推荐答案

问题是,unsafe是一种块表达式,所以当它出现在语句的开头时,我们可以省略末尾的分号,但这意味着它是作为一个完整的语句进行分析的,我们不能将其用作表达式的一部分.This is mentioned in the reference:

如果在允许使用语句的上下文中使用仅由block expression或控制流表达式组成的表达式,则可以省略尾随的分号.这可能会导致将其解析为独立语句和作为另一个表达式的一部分之间的歧义;在本例中,它被解析为语句.

解决办法是将其括在圆括号中:

fn function() -> bool {
    (unsafe { 1 }) == 1
}

Rust相关问答推荐

计算具有相邻调换且没有插入或删除的序列的距离

关联类型(类型参数)命名约定

如何最好地并行化修改同一Rust向量的多个切片的代码?

如何为utoipa中的可选查询参数生成OpenAPI模式?

修改切片/引用数组

关于如何初始化弱 struct 字段的语法问题

RUST应用程序正在退出,错误代码为:(退出代码:0xc0000005,STATUS_ACCESS_VIOLATION)

正则表达式中的重叠匹配?(铁 rust 正则式发动机)

变量需要parse()中的显式类型

如何使用reqwest进行异步请求?

什么是`&;[][..]`铁 rust 里的刻薄?

tokio::sync::broadcast::Receiver 不是克隆

如何在 Rust 中将函数项变成函数指针

Rust中的一生语法有什么作用?

如何使用 Rust Governor 为每 10 秒 10 个请求创建一个 RateLimiter?

如何在 Rust 中将 bson::Bson 转换为 Vec

是否可以在 Rust 中的特定字符上实现特征?

Rust HRTB 是相同的,但编译器说一种类型比另一种更通用

在 Rust 中返回对枚举变体的引用是个好主意吗?

深度嵌套枚举的清洁匹配臂