面向 Java 开发人员的 Rust 编程

位置:首页>文章>详情   分类: Java教程 > 编程技术   阅读(314)   2023-06-26 07:54:18

在越来越受欢迎的新型编程语言中,Rust 是其中之一。 于 2010 年首次推出,并因其性能、语法和线程安全特性而悄然获得了广泛关注。如果您是 Java 开发人员,您会发现 Rust 相对容易掌握,这要归功于这两种语言的相似性。

根据堆垛溢调调查,Rust 在语言流行度或最常用语言的阶梯上攀升,但最引人注目的是,Rust 不断成为所有语言中“最受欢迎的语言”。这证明了使用 Rust 的丰富经验。

如果您有 Java 背景,请继续阅读以了解有关 Rust 的一些主要知识。

Rust 语法

与 Java 一样,Rust 是编译的。它被编译为 LLVM 规范,在本质上类似于 虚拟机,允许输出到各种目标平台。

和 Java 一样,Rust 继承自 C 血统。它使用花括号表示块,使用分号表示行终止,这与 Java 完全相同。例如,您可以看到一个简单的程序这里,如清单 1。

清单 1. 简单的 Rust 代码

fn main() {    println!("Hello, !");}

请注意,有一个 main() 函数,类似于 Java 中的入口点。

Rust 中的函数

函数在 Rust 中是独立的,它们可以在任何地方声明,包括嵌套在其他函数中。这与 Java 不同,在 Java 中,函数总是声明为对象的方法(lambda 表达式除外)。换句话说,在 Java 中一切都是对象。在 Rust 中不是这样。

清单 2. 在 Rust 中使用函数

fn main() {    println!("Hello, world!");    fn function2(){        println!("Hello ");    }    function2();    function3();}fn function3() {    println!("Hello again.");}

隐式返回值

与 Java 不同,Rust 允许您跳过函数末尾的 return 关键字。函数中的最终语句将自动被评估为返回值。执行此操作时,您将省略最终语句中的分号。

拉姆达斯

与 Java 一样,Rust 支持 lambda 函数式编码。语法有所不同,但如果您熟悉 Java 流 API,则不难理解。清单 3 显示了使用 map() 函数将一组字符串变为大写。如您所见,它与 Java 非常相似。

清单 3. 使用 lambda 的函数式排序

// Rustfn main() {    let animals = ["dog", "badger", "quokka"];    let result = animals.iter().map(|value| value.to_uppercase());    for animal in result {        println!("Uppercased: {}", animal);    }}

map() 函数采用两部分参数。第一部分是管道字符内的变量,|value|,它将定义用作每个项目句柄的变量。第二部分是要执行的操作。在这种情况下,我们对数组的每个元素调用 to_uppercase()

请注意,与 Java 一样,Rust lambda 是捕获周围块状态的闭包。换句话说,它们可以访问它们在其中执行的变量上下文。

对象是 Rust 中的结构

看看清单 4,它引入了 struct 关键字。 struct 是 structure 的缩写,它允许你为数据定义一个容器,就像 Java 中类的状态部分一样。

清单 4. 使用 Rust 结构

struct Animal {  name: String}fn main() {  let dog = Animal{    name: String::from("Shiba")  };  println!("{}", dog.name);}

您在结构的大括号内定义结构的成员。这些变量类似于公共成员。

请注意,在声明 dog 变量的行中,无需调用新关键字。 Rust 可以从上下文中推断出新的引用是有序的。

接下来,请注意 name 变量在创建时设置为具有值的字符串。这是通过使用双冒号引用运算符调用内置的 String.from 方法来完成的。

最后,请注意,就像 Java 一样,Rust 使用点运算符访问 dog 实例上的 name 字段:dog.name

方法

您可以向结构添加函数,这些函数的行为方式与 Java 中的方法非常相似。例如,要将 speak() 方法添加到清单 4 中所示的 Animal 结构,您可以使用 impl 关键字,如清单 5 所示。

清单 5. 添加一个方法

impl Animal {  fn speak(&self) {      println!("{}", self.name);  }}

Impl 表示执行。在清单 5 中,我们正在实现 Animal 结构。我们定义了一个方法,speak,它接受一个参数。这个参数是特殊的 &self 指针(Rust 中的 & 表示参数是一个引用)。这个特殊指针与 Java 中的 this 关键字具有非常相似的语义。它指的是当前活动的对象实例。

调用dog.speak()会输出当前实例化对象的名称,在本例中为"Shiba"

Rust 中的可变性

如果你有 Java 背景,关于 Rust 的一个比较奇怪的事情是变量的默认不变性。简而言之,当你在 Rust 中声明一个变量时,它默认是不可变的,试图改变它会导致错误。

要使变量可变,必须添加 mut 关键字,但 mut 一次只能添加一个引用。请记住,Rust 高度关注保持代码线程安全。这也避免了 Java 中出现的并发修改错误。

清单 6 展示了如何使 dog 对象可变,然后为其分配一个新名称。

清单 6. 可变字符串

let mut dog = Animal{  name: String::from("Shiba")};dog.name = String::from("Suki");println!("{}", dog.name);

这里的关键是添加到声明中的 mut 关键字。

Rust 中的类型推断

在 Rust 中,您不必总是告诉编译器您声明的变量类型。对于来自 Java 的开发人员来说,这似乎很奇怪,因为在 Java 中没有推断变量类型的工具。例如,在清单 7 中,编译器正确地将类型推断为整数。

清单 7. 类型推断示例

let number1 = 10;let number2 = 10;println!("{}", number1 * number2);

阴影和变量名

另一个可能会让 Java 开发人员感到惊讶的 Rust 特性是所谓的变量阴影。本质上,您可以在其之上创建一个同名的掩码,而不是将变量声明为可变的。

这是一种一次性可变性,可以为相同的变量名创建一个新空间。总的来说,重用同一个变量名的能力与Java不同。清单 8 显示了变量阴影的一个简单示例。

清单 8. 变量阴影

fn main() {    let x = 5;    let x = x + 1;    println!("The value of x is: {}", x); // outputs 6}

Rust 中的元组类型

Rust 支持元组类型,这是一种在 Java 中没有真正模拟的复合变量。清单 9 向您展示了一个实际中的元组示例。

清单 9. 使用元组类型

fn main() {    let myTuple = ("Sum", 10, 5);    let (x, y) = myTuple ;    println!("The {} is: {}", x, y + z);}

在这里您可以看到 myTuple 变量是用包含三个值的括号声明的,一个字符串和两个整数。这是一个元组。

您可以将元组“解构”为标量变量,如下一行所示,其中 let 关键字用于填充每个变量,xyz,以及来自元组的值。

您还可以通过索引访问元组成员。例如,tup.0 引用元组的第一个字段(字符串 "Sum")。

Rust 中的特征和泛型

在 Rust 中有特征的概念,它类似于 Java 中的细粒度接口:它们定义了一个类型与其他类型共享的属性。换句话说,特征抽象了不同类型的通用功能。

Rust 中的泛型与 Java 中的泛型的工作方式类似,使用类似的尖括号语法,用于基于类型的共享属性以通用方式寻址类型。

看一下清单 10,它总结了使用 Rust 手册中的特征的示例。

清单 10. 使用特征

pub trait Summary {    fn summarize(&self) -> String;}pub struct NewsArticle {    pub headline: String,    pub location: String,    pub author: String,    pub content: String,}impl Summary for NewsArticle {    fn summarize(&self) -> String {        format!("{}, by {} ({})", self.headline, self.author, self.location)    }}pub struct Tweet {    pub username: String,    pub content: String,    pub reply: bool,    pub retweet: bool,}impl Summary for Tweet {    fn summarize(&self) -> String {        format!("{}: {}", self.username, self.content)    }}fn main() {    let tweet = Tweet {        username: String::from("dog_post"),        content: String::from("A Shih Tzu is smaller than a Lurcher",        ),        reply: false,        retweet: false,    };    println!("1 new tweet: {}", tweet.summarize());}

这里 trait 关键字用于定义一个 Summary 属性,然后为每个类型实现该属性, NewsArticle Tweet,使用 impl 关键字。所以这与 Java 中的接口非常相似,除了在 Java 中接口定义了整个类的表面,而不是零碎的定义方法。

一种并不奇怪的酿造

虽然这是对刚接触 Rust 的 Java 开发人员来说最重要的一些要点的简要介绍,但您可以看到该语言并不难上手。对新技术保持开放的心态总是好的,Rust 以其一致的开发人员满意度评级来推荐自己。

地址:https://www.cundage.com/article/3651362-rust-programming-for-java-developers.html

相关阅读

基础设施即代码 vendor 缅甸语 is adding support for 爪哇 and YAML, as it looks to allow software developers to...
在越来越受欢迎的新型编程语言中,Rust 是其中之一。 锈 于 2010 年首次推出,并因其性能、语法和线程安全特性而悄然获得了广泛关注。如果您是 Java 开发人员,您会发现 Rust 相对容...
Java is 同时, 面向对象, and intended to let application developers “一次编写,随处运行” (WORA). Java is consider...
For the second consecutive year, Python 被评为 TIobe 的年度编程语言, a distinction the company awards to th...
Java Development Kit (JDK) 是 Java 编程中使用的三个核心技术包之一,另外两个是 JVM(Java 虚拟机)和 JRE(Java 运行时环境)。区分这三种技术并了解...
尽管 Java 8 已经问世近八年了,但在 Perforce Software 公司最近的一项调查中,它仍然是用户中最常用的 Java 版本。然而,调查发现,许多商店计划升级到更新得多的 Jav...
根据最近一项全球开发人员调查,在开发人员偏好方面,JavaScript 和 Python 保持了持久力,而 锈 的使用率正在上升. 5 月 4 日的一份题为“开发者国家情况,第 22nd 版”的...
Java 19 刚到 将于 9 月 20 日发布,Java 20 是下一个待定事项,预计将于 2023 年 3 月发布。该版本可能会为通用泛型、不可变数据和字符串模板添加新功能,并完成诸如此类的...
Java 18 将在两周内作为生产版本发布,Java 19 已初具规模。标准 Java 的下一个版本将通过 API 向前推进,以与 Java 运行时之外的代码进行互操作,这是许多潜在提案中的第一...
Jakarta EE 10, the latest version of the Eclipse Foundation 的企业 Java 平台, arrives today, emphasizi...