首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么Rust不让我比较Foo和an &Foo呢?

Rust不允许直接比较Foo&Foo的原因是因为它们是不同的类型。Foo是一个具体的类型,而&Foo是一个指向Foo类型的引用。

在Rust中,比较操作符(如==!=)的实现是由类型自身决定的。为了进行比较,两个操作数的类型必须匹配。对于Foo&Foo来说,它们是不同的类型,因此不能直接进行比较。

如果你想比较Foo&Foo,你可以通过解引用操作符*将引用转换为具体类型,然后再进行比较。例如,你可以使用*操作符将&Foo解引用为Foo类型,然后再进行比较。

另外,Rust还提供了一些其他的比较方法,如实现PartialEqPartialOrd trait来定义自定义的比较行为。通过实现这些trait,你可以在自定义类型上定义比较操作符的行为,使其能够与其他类型进行比较。

总结起来,Rust不允许直接比较Foo&Foo是因为它们是不同的类型,你可以通过解引用操作符将引用转换为具体类型,或者通过实现PartialEqPartialOrd trait来定义自定义的比较行为。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Rust日报】2020-07-30 fixed_vec减少Rust数组冗余边界检查

Rust 的发布周期是比较固定的,Nightly是每晚,betastable是每六周发布一版。但是 Edition现在还没有确定。那什么时候用 Edition?...对于使用Rust的人来说,每三年的 Edition,其实就是一个 「总结」。 2021 edition 应该有什么特性?...但是,Rust 官方会在 10月份以后发布一个 RFC 的,目前主要是 Niko Steve 在做这个,当然,Niko 还是主力担当。 为什么是三年?...("This will seg fault: {}", val)); } 作者本人对这部分代码能够正常运行感到疑惑,特别是为什么foo函数能够被caller()函数里强制转化成nullptr调用。...可能有小伙伴访问StackOverflow比较缓慢,这里复制高赞回复的原文: This program never actually constructs a function pointer to

89520

Rust投稿】捋捋 Rust 中的 impl Trait dyn Trait

为什么 Box 形式的返回值会被废弃而引入了新的 dyn 关键字? 埋坑 impl Trait dyn Trait 在 Rust 分别被称为静态分发动态分发....假设 Foo Bar 都实现了 Noop 特性, Rust 会把函数 fn x(...) -> impl Noop 展开为 fn x_for_foo(...) -> Foofn x_for_bar(...既然 trait object 在实现时可以确定大小, 那为什么不用 fn x() -> Trait 的形式?...那么问题来了, 为什么编译器会提示 Box 会被废弃, 特地引入了 dyn 关键字? 答案可以在 RFC-2113 中找到....如果是 Rust 2018 编译器应该还会显示一条警告, 告诉我们应该使用 impl dyn Foo {} 第三个例子则以函数类型函数 trait 作对比, 两者差别只在于首字母是否大写(Fn代表函数

2.4K10

对 王垠《对 Rust 语言的分析》的分析

这几年也有不少新手在群里引用王垠这篇文章对 Rust 的看法,或者直接问我,原以为过去五年了,王垠应该对文章里对观点有所更新吧,然而并没有。 垠神粉丝众多(包括自己),影响比较大。...垠神自己对 Rust 怎么看,其实并不关心。只是针对这篇文章里对 Rust 的观点,大家做一次探讨交流。希望能对 Rust 新手提供另一种思考角度。 “说明: 发这篇文章,绝不是为了引战。...觉得把 Rust Yin 语言相比,有失偏颇。 其次,虽然没有王垠一样读过名校,也没有系统地学过计算机编程语言理论。...最后,Rust 语言的出现,是为了解决内存安全问题。变量默认不变,就是它为了解决此问题而采取的一种方案。但 Rust 也提供 mut 关键字来定义可变变量。那为什么需要「变量遮蔽」这种功能?...现在你说可以通过一些特殊的构造,特殊的指针传值方式,静态的决定内存的回收时间,真的有可能吗? 认识 Rust 六年了,从来没有听说 Rust 能「静态决定内存回收时间」,出处是哪里

2K20

Rust 研学】Rust Nation UK 2024 | Rust ABI 稳定之路

本系列为学习 Rust Nation UK 2024 大会的笔记,不会是所有演讲,只拣一些感兴趣的内容。...为什么这么难? 当前面临两个挑战: 实现细节并未被 Rust 明确定义,(理解为是没有 Rust 语言规范)。比如调用约定、符号混淆、内存布局、crate 元数据格式等等。...“niche 一般翻译为“利基”,这个词用在商业市场领域可能比较适合。但是在技术领域,比如在 Rust 中就不太好。...这就是为什么size_of::>>()等于8字节,因为Box指针本身可以用来区分SomeNone变体。...动态分配类型 trait 描述符在某些环境不可用。 性能优化 如上所述,稳定 ABI 的解决方案实际上引入了一些中间层。那么如何优化? 有时候会通过泄露实现细节来获取性能提升。

20410

Rust 提升安全性的方式

在提出一个新的编程语言的时候,设计者必须要回答的一个问题是「为什么要设计这样一个编程语言?」。对于 Rust 来说,他的目的就是要在保证安全的基础上不失对底层的控制力。... C++ 不同,Rust 中默认是不可变的,这包括了变量默认不可变,借用也是默认不可变的,所以以下代码是非法的: fn foo(v: &Vec) { // error: cannot...[1, 2, 3]; foo(&mut v) } 正如前文所述,aliasing mutation 同时存在的时候,程序就很可能出现问题,而多个不可变借用单个可变借用都是安全的,所以,Rust...这样有什么意义?现在回到之前的迭代器失效的问题上,考虑一下如果我们在 Rust 里写类似之前用 C++ 写出的代码会出现什么结果?...看起来似乎没什么问题,但是如果这样调用

91920

初窥Rust

但是拖延症让一直拖到2周以前才开始学习Rust. 现代编程语言一般都围绕三个方面进行设计:范式,内存,并发(这是自己的理解,也许并不正确,毕竟没有设计过编程语言:D)。...简直是发明了,除引用计数标记清除之外的第三种内存管理方式。 这种限制似乎在实现复杂数据结构上颇为掣肘。...那为什么在GO语言上也会出现这种现象,因为goroutine是跑在线程池上的。 也许你会说:“加个锁不就好了么?”,“GO推荐使用channel进行通信,你用了不就解决问题了”。...同样, Rust的多线程也允许两种同步方式:加锁channel。 使用channel进行同步时,多线程不可以同时访问同一个变量,因为在发送某一个值时,连它的“所有权”也一起发送出去了。...Rust继C,Lua之后喜欢的第三门语言。

34030

Rust日报】2020-07-26 - Easy RustRust文档更容易理解

Rust Stable 1.45 中的 "神奇" Bug 解读 今天Rust 官方仓库里报告了一个神奇的Bug,该 Bug 似乎动摇了 Rust 的世界法则,该 Bug 的表现如下: struct Foo...{ x: i32, } fn main() { let mut foo = Foo { x: 42 }; let x = &mut foo.x; *x = 13;...本文介绍了这个插件能够实现的功能,以及它的工作原理、架构设计一些挑战。...让Rust文档更容易理解 Rust的文档已经很全面了,但是很多非英语母语的人理解起来可能比较困难,easy rust比较容易理解的表述方式组织了Rust文档。...https://github.com/Dhghomon/easy_rust Rust项目测试小技巧 在Rust项目中,如果你要对私有方法做测试,你该怎么办?临时将方法改为public?别再这样做了。

42430

rust 上手很难?搞懂这些知识,前端开发能快速成为 rust 高手

的交流群里有许多人在讨论 rust。所以陆续有人开始尝试学习 rust,不过大家的一致共识就是:rust 上手很困难。当然,这样的共识在网上也普遍存在。...大家可以将这篇文章作为 rust 学习的先导片,将会提前为大家扫清那些阻碍你学习 rust 的障碍,极大的降低 rust 的上手成本。...《JavaScript 核心进阶》中,专门花费了很多篇幅来讲解为什么这是一个错误的理解。...为什么,因为在 rust 中,默认是按照按值访问/传递。查看如下代码 需要一个可变的变量 b2,然后通过修改 b2 的值,来观察 book 的变化。...rust 也支持泛型,而泛型是 TS 的核心特性之一。rust 也有完善的类型推导机制,所以学习思路 TS 都是一样的,关键的问题是,TS 的泛型类型推导,反而更加灵活与复杂。

54320

Rust日报】 2019-12-20 Serverless - Rust 使用 WASM 加 Cloudflare

Signal選擇將Rust用於們的Raft實現,他們選擇的重點是因為正確性,而不是性能,因此即使有機會加快某些操作的速度,們也不會偏離Raft規範。...使用 WASM 加 Cloudflare 作者原本使用 actix-web 但因為好奇心接觸了 Cloudflare Workers Cloudflare Workers是支持RustWASM的無服務器平台...每次更改代碼都需要重新編譯Rust代碼,打包並將其發送到Cloudflare以及刷新頁面。特別是由於使用的是經過編譯時檢查的HTML模板,因此速度非常慢。...Cloudflare小組的某人建議可以將其密鑰/值存儲成檔案。選擇了一個傻瓜方式,將機密(加密密鑰Recaptcha機密密鑰)直接編譯為可執行文件。...那到底要怎麼使用 Cloudflare Workers 與 rust 結合?請看原始文章。

75710

与 ChatGPT 深度对话来学 Rust | 生命周期

要识别这种问题,需要你对 Rust 语言的生命周期有一定了解,这就是为什么在前面说,ChatGPT 目前更像是一个学习伙伴而不是老师。需要你自己对其回复结果做正确性审查。 因此继续询问。...为了进一步深入到生命周期参数的探讨,Rust Quiz 第 11 题[2]抛给了 ChatGPT。 问: “ 那你看下面 rust 代码能否编译通过?...最后,我们比较两个函数指针 pf pg,它们的类型都是 fn(),如果它们相等,则输出 1,否则输出 0。...问: “你的解释基本正确,能否再结合rust编译器借用检查规则对于 early boundlate bound的区别,进一步详细解释上面代码 ChatGPT 回复: “当我们声明一个类型或函数的生命周期参数时...但是,如果和它深入对话,不断地对它提出质疑,可以逼近比较准确的答案。这就意味着,ChatGPT 原本是对 Rust 语言有一定掌握的。

1.2K60

针对常量泛型参数的分类实现

mdbook 版:https://zjp-cn.github.io/rust-note/forum/impl-const-param.html 背景与问题 const 在 Rust 中是一个关键字,而且总是围绕着常量表达式...(constant expressions) 编译期求值等话题。...比如对于 struct Item,如果我们需要对 I == 0 I != 0 两种情况做不同的实现,该怎么做?...或者在这些分类中,我们想要同样的函数名返回不同的类型没有完美的答案,因为具体的需求会导致不同的代码设计。...给出自己的思考结果: 常量泛型参数无法拓展到自定义类型,所以需要围绕基本类型来实现; 常量表达式总是意味着它的值必须在编译时知晓,所以它的来源很狭窄,唯有泛型函数帮助我们做更多事情。

71110

Rust 中 Trait 的使用及实现分析

("{}", n); } } // 依次输出 2 4 6 8 10 关联类型的使用泛型相似,Iterator 也可使用泛型来定义: pub trait Iterator {...使用 fat pointer(即两个指针) 来表示 trait object 的引用,分布指向 data 与 vtable,这 Go 中的 interface 十分类似。...如果 trait 有继承关系时,vtable 是怎么存储不同 trait 的方法的?在目前的实现中,是依次存放在一个 vtable 中的,如下图: ?...= foo.as_base(); base.base(); } 向下转型(downcast) 向下转型是指把一个 trait object 再转为之前的具体类型,Rust 提供了 Any 这个...这是由于 Rust 会默认为 trait object 实现该 trait,生成类似下面的代码: 如果 Foo 继承了 Sized,那么就要求 trait object 也是 Sized,而 trait

1.8K41

RustChinaConf 2022 大会议题回顾 | Part I : Rustdoc 你可以用它做什么以及它的未来

的最终目标是使文档的编写尽可能简单,以便所有项目都有很好的文档 Rustdoc是官方的Rust工具,可以为你的crates生成文档。...演讲摘要 什么是 rustdoc rustdoc 是 Rust 编译器 rustc 一起提供的工具,用于生成代码的文档。通过 cargo doc 命令开发者就可以用其生成文档。...如何用 rustdoc 创建文档 在 Rust 里可以通过基本的文档注释 /// //!来创建文档, Guillaume 在演讲视频中也做了演示,因为这是最基本的语法,本文里就不做过多介绍。.../// ``` // edition2015,edition2018 edition2021 用于告诉rustdoc, // 代码示例应该使用相应版本的 Rust 编译 /// Only runs...知道这个知识点有什么用?利用 #[doc] 允许我们可以更好地编写文档。 可以把 README 复用为文档注释 #[doc = include_str!("../..

55820
领券