在越来越受欢迎的新型编程语言中,Rust 是其中之一。 锈 于 2010 年首次推出,并因其性能、语法和线程安全特性而悄然获得了广泛关注。如果您是 Java 开发人员,您会发现 Rust 相对容易掌握,这要归功于这两种语言的相似性。
根据堆垛溢调调查,Rust 在语言流行度或最常用语言的阶梯上攀升,但最引人注目的是,Rust 不断成为所有语言中“最受欢迎的语言”。这证明了使用 Rust 的丰富经验。
如果您有 Java 背景,请继续阅读以了解有关 Rust 的一些主要知识。
与 Java 一样,Rust 是编译的。它被编译为 LLVM 规范,在本质上类似于 虚拟机,允许输出到各种目标平台。
和 Java 一样,Rust 继承自 C 血统。它使用花括号表示块,使用分号表示行终止,这与 Java 完全相同。例如,您可以看到一个简单的程序这里,如清单 1。
fn main() { println!("Hello, !");}
请注意,有一个 main()
函数,类似于 Java 中的入口点。
函数在 Rust 中是独立的,它们可以在任何地方声明,包括嵌套在其他函数中。这与 Java 不同,在 Java 中,函数总是声明为对象的方法(lambda 表达式除外)。换句话说,在 Java 中一切都是对象。在 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 非常相似。
// 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 是捕获周围块状态的闭包。换句话说,它们可以访问它们在其中执行的变量上下文。
看看清单 4,它引入了 struct
关键字。 struct 是 structure 的缩写,它允许你为数据定义一个容器,就像 Java 中类的状态部分一样。
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 所示。
impl Animal { fn speak(&self) { println!("{}", self.name); }}
Impl 表示执行。在清单 5 中,我们正在实现 Animal
结构。我们定义了一个方法,speak
,它接受一个参数。这个参数是特殊的 &self
指针(Rust 中的 & 表示参数是一个引用)。这个特殊指针与 Java 中的 this
关键字具有非常相似的语义。它指的是当前活动的对象实例。
调用dog.speak()
会输出当前实例化对象的名称,在本例中为"Shiba"
。
如果你有 Java 背景,关于 Rust 的一个比较奇怪的事情是变量的默认不变性。简而言之,当你在 Rust 中声明一个变量时,它默认是不可变的,试图改变它会导致错误。
要使变量可变,必须添加 mut
关键字,但 mut
一次只能添加一个引用。请记住,Rust 高度关注保持代码线程安全。这也避免了 Java 中出现的并发修改错误。
清单 6 展示了如何使 dog
对象可变,然后为其分配一个新名称。
let mut dog = Animal{ name: String::from("Shiba")};dog.name = String::from("Suki");println!("{}", dog.name);
这里的关键是添加到声明中的 mut
关键字。
在 Rust 中,您不必总是告诉编译器您声明的变量类型。对于来自 Java 的开发人员来说,这似乎很奇怪,因为在 Java 中没有推断变量类型的工具。例如,在清单 7 中,编译器正确地将类型推断为整数。
let number1 = 10;let number2 = 10;println!("{}", number1 * number2);
另一个可能会让 Java 开发人员感到惊讶的 Rust 特性是所谓的变量阴影。本质上,您可以在其之上创建一个同名的掩码,而不是将变量声明为可变的。
这是一种一次性可变性,可以为相同的变量名创建一个新空间。总的来说,重用同一个变量名的能力与Java不同。清单 8 显示了变量阴影的一个简单示例。
fn main() { let x = 5; let x = x + 1; println!("The value of x is: {}", x); // outputs 6}
Rust 支持元组类型,这是一种在 Java 中没有真正模拟的复合变量。清单 9 向您展示了一个实际中的元组示例。
fn main() { let myTuple = ("Sum", 10, 5); let (x, y) = myTuple ; println!("The {} is: {}", x, y + z);}
在这里您可以看到 myTuple
变量是用包含三个值的括号声明的,一个字符串和两个整数。这是一个元组。
您可以将元组“解构”为标量变量,如下一行所示,其中 let
关键字用于填充每个变量,x
、y
和 z
,以及来自元组的值。
您还可以通过索引访问元组成员。例如,tup.0
引用元组的第一个字段(字符串 "Sum"
)。
在 Rust 中有特征的概念,它类似于 Java 中的细粒度接口:它们定义了一个类型与其他类型共享的属性。换句话说,特征抽象了不同类型的通用功能。
Rust 中的泛型与 Java 中的泛型的工作方式类似,使用类似的尖括号语法,用于基于类型的共享属性以通用方式寻址类型。
看一下清单 10,它总结了使用 Rust 手册中的特征的示例。
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