首页 > 编程语言 >【Rust】从 Node.js 开发者的视角深入理解 Rust 的所有权与借用机制

【Rust】从 Node.js 开发者的视角深入理解 Rust 的所有权与借用机制

时间:2025-01-07 23:34:28浏览次数:1  
标签:Node s2 s1 js let 内存 借用 Rust

Rust 的所有权(Ownership)与借用(Borrowing)机制是其区别于其他编程语言的核心特性,也是保障内存安全的重要基石。

在本文中,我们将从熟悉 Node.js 的开发者视角出发,探讨 Rust 如何通过这些独特的设计实现高效可靠的内存管理,并对比 JavaScript 的垃圾回收机制,帮助您更容易理解这些概念。

Rust 的所有权模型

Rust 的内存管理围绕“所有权”模型展开,这种模型通过编译时检查保证了内存安全,而无需依赖垃圾回收器。

它基于以下三个规则:

  1. 每个值在 Rust 中都有一个唯一的所有者。

  2. 一个值可以被借用,但同一时间只能有一个可变借用或多个不可变借用。

  3. 当所有者离开作用域时,值会被自动销毁,释放内存。

相比之下,Node.js 中的垃圾回收机制自动管理内存分配与释放,无需开发者手动干预。但这种便利性有时会导致性能问题或偶发的内存泄漏。

所有权示例

让我们通过一个简单示例来理解 Rust 的所有权规则,并与 Node.js 中的表现进行对比:

【图】Ownership

Rust 示例

fn main() {
    let s1 = String::from("hello");
    let s2 = s1;
    println!("{}, world!", s1); // 编译报错
}

在上述代码中,s1 的值被赋给了 s2,此时所有权从 s1 转移到了 s2。因此,s1 被视为无效,再次使用它会导致编译错误。

Node.js 示例

let s1 = "hello";
let s2 = s1;
console.log(`${s1}, world!`);

在 JavaScript 中,同样的代码可以正常运行,因为字符串是不可变的,赋值只是创建了一个引用,不涉及所有权的概念。

Rust 的借用机制 :

为了避免所有权转移引发的问题,Rust 提供了“借用”机制,使得我们可以在不转移所有权的前提下临时访问一个值。

借用分为 不可变借用 可变借用 两种类型。

【图】Borrowing

不可变借用 :

不可变借用允许我们读取值,但不能修改值。例如:

fn main() {
    let s1 = String::from("hello");
    let s2 = &s1;
    println!("{}, world!", s1); // s1 依然有效
}

在这个例子中,我们通过 &s1 创建了 s1 的不可变引用(借用)。因此,即使 s2 引用了 s1,我们依然可以正常使用 s1。

可变借用 :

可变借用允许我们修改值,但在借用期间,原值不能被其他地方访问:

fn main() {
    let mut s1 = String::from("hello");
    let s2 = &mut s1;
    s2.push_str(", world!");
    println!("{}", s1); // 编译报错
}

在这里,我们通过 &mut s1 创建了一个可变引用。在可变引用 s2 存在期间,s1 无法被访问,Rust 通过编译器强制保证数据竞争不会发生。

Node.js 示例

let s1 = "hello";
let s2 = s1;
s2 += ", world!";
console.log(s1); // 输出 "hello"

在 JavaScript 中,s1 和 s2 是两个独立的值,修改 s2 并不会影响 s1。这与 Rust 的借用规则完全不同。

为什么选择 Rust 的所有权与借用模型?

虽然 Rust 的所有权与借用规则看起来复杂,但它带来的内存安全与性能优化是 JavaScript 垃圾回收机制无法比拟的:

内存安全:所有权模型通过编译时检查防止了悬挂指针、内存泄漏等常见问题。

无运行时开销:Rust 在编译时解决内存管理问题,因此不会对运行时性能产生额外负担。

数据竞争的预防:借用机制通过严格的规则防止了多线程环境中的数据竞争。

总结

Rust 的所有权与借用机制虽然对习惯了垃圾回收的 Node.js 开发者来说可能显得陌生,但其严格的规则为内存安全与高效性能提供了有力保障。

在开发 Rust 项目时,这些概念可能需要一些时间去适应,但一旦熟悉,您会发现它们能显著提升代码的可靠性和效率。

通过深入理解这些核心特性,您将能够更好地驾驭 Rust,为复杂的系统开发打下坚实基础。

参考:https://medium.com/bridging-the-gap-between-node-js-and-rust/rusts-borrowing-and-ownership-4a2aa833172b

原创 川后静波 吴建明利驰软件

标签:Node,s2,s1,js,let,内存,借用,Rust
From: https://www.cnblogs.com/o-O-oO/p/18658649

相关文章

  • JS-20 字符串
    字符串就是零个或多个排在一起的字符,放在单引号或双引号之中'zifuchan'"zifuchuan"单引号字符串的内部,可以使用双引号。双引号字符串的内部,可以使用单引号'key="value"'"It'salongzifuchuan"如果要在单引号字符串的内部,使用单引号,就必须在内部的单引号前面加上反斜杠,用......
  • rust学习十五.5、引用循环和内存泄露
    这个章节主要是为了引出弱引用这个奇怪的概念。说实在,这个没有什么太好写的,因为内容比较晦涩难懂! 在其它语言中,也常常存在所谓循环引用问题,和大部分问题一样,在其它语言中这些基本上都不是问题。但是在rust中,这是一个致命的问题。 例如有a,b两个点,a指向b,b指向a。如果根据截......
  • next.js实现SSR入门
    Next.js是一个基于React的框架,支持服务端渲染(Server-SideRendering,简称SSR)和静态站点生成(StaticSiteGeneration,简称SSG)。SSR是指在服务端生成HTML页面后再发送到浏览器,而不是将所有工作交给客户端。这种方式可以提升页面的首屏加载速度并有助于SEO。第一部分:ne......
  • JS-19 break语句和continue语句
     break语句和continue语句都具有跳转作用,可以让代码不按既有的顺序执行1、breakbreak语句用于跳出代码块或循环for(vari=0;i<5;i++){if(i===3){break;}console.log(i);}2、breakbreak语句用于跳出代码块或循......
  • JS-18 循环语句之while
    While语句包括一个循环条件和一段代码块,只要条件为真,就不断循环执行代码块。while(条件){语句;}1、while例子vari=0;while(i<100){console.log('i当前为:'+1);i=i+1;} 下面的例子是一个无限循环,因为循环条件总是为真while(true){consol......
  • 【NodeJs安全】探索
    免责声明"本文档所提供的信息旨在帮助网络安全专业人员更好地理解并维护他们负责的网站和服务器等系统。我们鼓励在获得适当授权的情况下使用这些信息。请注意,任何未经授权的使用或由此产生的直接或间接后果和损失,均由使用者自行承担。我们提供的资源和工具仅供学习和研究之用,我......
  • 在 C++ 中优雅地处理 JSON:nlohmann/json 库实践指南
    JSON(JavaScriptObjectNotation)作为一种轻量级的数据交换格式,在现代软件开发中扮演着重要角色。在C++开发中,nlohmann/json库因其易用性和灵活性而广受欢迎。本文将通过实例介绍如何使用这个强大的库进行JSON数据的序列化和反序列化操作。环境准备首先,我们需要配置项目......
  • 大学生HTML5期末作业 Web前端网页制作 html5+css3+js html+css+js网页设计 体育 腾讯
    大学生HTML5期末作业Web前端网页制作html5+css3+jshtml+css+js网页设计体育腾讯体育7个页面网页作品代码简单,可使用任意HTML辑软件(如:Dreamweaver、HBuilder、Vscode、Sublime、Webstorm、Text、Notepad++等任意html编辑软件进行运行及修改编辑等操作)。获取源码1......
  • 大学生HTML5期末作业 html+css网页制作 新闻 自定义新闻主题2个页面 Web前端网页制作
    大学生HTML5期末作业html+css网页制作新闻自定义新闻主题2个页面Web前端网页制作html5+css3+js网页作品代码简单,可使用任意HTML辑软件(如:Dreamweaver、HBuilder、Vscode、Sublime、Webstorm、Text、Notepad++等任意html编辑软件进行运行及修改编辑等操作)。获取源......
  • jacksonjson 反序列化localdatetime指定格式输出
    在使用Jackson进行JSON反序列化时,如果需要将JSON中的日期时间字符串转换为LocalDateTime类型,并指定特定的格式,可以使用@JsonFormat注解。以下是具体的使用方法:1.添加依赖确保你的项目中已经引入了Jackson依赖。如果使用Maven,可以在pom.xml中添加以下依赖:<depe......