为什么Rust在给出Self::from(x)的警告时,不给出使用x.into()方法的"无条件递归"警告?

考虑下面的示例,in rust playground:

struct Foo;
struct Bar;

impl From<Foo> for Bar {
    fn from(x: Foo) -> Self {
        x.into() // No recursion warning
    }
}

fn main() {}

考虑显示递归警告in rust playground的另一个示例

struct Foo;
struct Bar;

impl From<Foo> for Bar {
    fn from(x: Foo) -> Self {
        Self::from(x) // Shows recursion warning
    }
}

fn main() {}
warning: function cannot return without recursing
 --> src/main.rs:5:5
  |
5 |     fn from(x: Foo) -> Self {
  |     ^^^^^^^^^^^^^^^^^^^^^^^ cannot return without recursing
6 |         Self::from(x)
  |         ------------- recursive call site
  |
  = note: `#[warn(unconditional_recursion)]` on by default
  = help: a `loop` may express intention better if this is on purpose

推荐答案

该方法不是直接调用自身,而是调用另一个特征实现.恰好特征实现将回调到第一个,但编译器不进行跨函数分析.这也不会触发警告:

fn a() { b(); }
fn b() { a(); }

fn main() {
    a();
}

跨功能判断比本地功能判断更复杂,也更难有效地apply.有an open issue个人要抓住这个案子.

Rust相关问答推荐

为什么Tauri要修改被调用函数的参数名称?

为什么我需要在这个代码示例中使用&

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

什么是Rust惯用的方式来使特征向量具有单个向量项的别名?

在泛型 struct 的字段声明中访问关联的Conant

为什么`Vec i64`的和不知道是`Option i64`?

替换可变引用中的字符串会泄漏内存吗?

如何将映射反序列化为具有与键匹配的字段的定制 struct 的向量?

写入引用会更新基础值,但引用会打印意外的值

你能在Rust中弃用一个属性吗?

期望一个具有固定大小 x 元素的数组,找到一个具有 y 元素的数组

在 Rust 中,在需要引用 self 的 struct 体方法中使用闭包作为 while 循环条件

我可以解构self 参数吗?

std mpsc 发送者通道在闭包中使用时关闭

方法可以被误认为是标准特性方法

如何将参数传递给Rust 的线程?

判断对象是 PyDatetime 还是 Pydate 的实例?

如何使用 rust bindgen 生成的 std_vector

我如何将 google_gmail1::Gmail> 传递给线程生成?

如何从 Rust 应用程序连接到 Docker 容器中的 SurrealDB?