热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Java程序员学习Rust编程infoworld

如果您是Java开发人员,您会发现Rust相对容易掌握,这要归功于这两种语言的相似性。technology-most-loved-dreaded-and-wantedclass&



如果您是 Java 开发人员,您会发现 Rust 相对容易掌握,这要归功于这两种语言的相似性。

technology-most-loved-dreaded-and-wanted" class='body_href' >根据Stack Overflow的调查,Rust 已经在语言流行度或最常用语言的阶梯上攀升,但最引人注目的是,Rust 不断成为“最受喜爱的语言” 。这证明了使用 Rust 的丰富经验。
 
Rust 语法
像 Java 一样,Rust 也是编译好的。它被编译为LLVM规范,在精神上类似于JVM,允许输出到各种目标平台。

和 Java 一样,Rust 起源于 C 血统。它在块中使用花括号,在行终止时使用分号,这与 Java 完全相同。例如,您可以在这里看到一个简单的程序,如:

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


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

Rust中的函数
函数在Rust中是独立的,它们可以在任何地方声明,包括嵌套在其他函数中。
这与Java不同,在Java中,函数总是被声明为对象的方法(除了lambdas的情况)。
换句话说,在Java中,所有东西都是一个对象。在Rust中则不然。

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



 

隐式返回值
与Java不同,Rust允许你在函数的结尾跳过返回return关键字。函数中的最后一条语句将自动被评估为返回值。
这样做时,你可以省略最后语句中的分号。
 

lambdas代码
和Java一样,Rust支持功能式编码的lambdas。语法是不同的,但如果你熟悉Java流API,就不难理解。
项目显示了使用map()函数使一组字符串大写的情况。正如你所看到的,这与Java很相似。

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



map()函数需要一个两部分的参数:
  1. 第一部分是管道字符里面的一个变量,|value|,它将定义作为每个项目的句柄的变量。
  2. 第二部分是要执行的操作。在本例中,我们对数组的每个元素调用to_uppercase()。

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

对象是Rust中的struct
下面代码介绍了struct关键字。struct是结构的简称,它允许你定义一个数据容器,就像Java中类的状态部分。

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


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

请注意,在你声明dog变量的那一行,没有必要调用new关键字。
Rust可以从上下文中推断出,但是一个新的引用变量名是有必要的。

接下来,注意到变量名在创建时被设置为一个带值的字符串。这是通过调用内置的String.from方法,使用双冒号引用操作符完成的。

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

方法
您可以向struct添加函数,这些函数的行为方式与Java中的方法基本相同。
例如,为了给上述代码中所示的Animal struct添加一个speak()方法,你可以使用impl关键字。

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


Impl意味着实现接口或父类。
上述代码我们正在实现Animal struct:我们定义了一个方法speak,它需要一个参数。
这个参数是特殊的&self指针(Rust中的&意味着参数是一个引用指针)。
这个特殊指针的语义与Java中的this关键字非常相似。它指的是当前活动的对象实例。

调用dog.speak()将输出当前实例化对象的名称。
在这个例子中输出结果是 "Shiba"。
 

Rust中的可变性
如果你有Java背景,那么Rust的一个比较奇怪的地方就是变量的默认不可变性。
简而言之,当你在Rust中声明一个变量时,它默认是不可变的,试图改变它将导致一个错误。

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

下面代码显示了如何使dog对象变异,然后给它分配一个新的名字。

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



 

Rust中的类型推理
在Rust中,你并不总是需要告诉编译器你正在声明什么类型的变量。
对于来自Java的开发者来说,这似乎很奇怪,因为在Java中没有推断变量类型的工具。
例如,下面代码编译器正确地将类型推断为整数。

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




 

阴影Shadowing和变量名
另一个可能会让Java开发者感到惊讶的Rust特性是所谓的变量阴影shadowing。
从本质上讲,你可以在一个变量上面创建一个同名的可变变量“罩子”,而不是把它声明为可变的。

这是一种一次性的可变性,为相同的变量名称创建一个新的空间。
一般来说,重复使用同一变量名的能力与Java不同。
下面显示了一个变量阴影的简单例子。

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


 

Rust中的元组类型
Rust支持元组类型,它是一种复合变量,在Java中没有真正的类似物。
下面代码向你展示了一个元组的实例。

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中的traits和泛型
在Rust中,有一个traits的概念,它类似于Java中的“接口interface”。它们定义了一个类型与其他类型共享的属性。
换句话说,traits抽象了不同类型的共同功能。

Rust中的泛型与Java中的泛型类似,使用类似的角括号语法,根据类型的共享属性,以一般的方式处理类型。

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属性,然后用impl关键字为每个struct对象类型(NewsArticle和Tweet)实现这个属性。
所以这与Java中的接口非常相似,只是在Java中,接口定义了整个类的表面,而不是零散地定义方法。


推荐阅读
  • 本文探讨了如何通过预处理器开关选择不同的类实现,并解决在特定情况下遇到的链接器错误。 ... [详细]
  • 深入解析Java枚举及其高级特性
    本文详细介绍了Java枚举的概念、语法、使用规则和应用场景,并探讨了其在实际编程中的高级应用。所有相关内容已收录于GitHub仓库[JavaLearningmanual](https://github.com/Ziphtracks/JavaLearningmanual),欢迎Star并持续关注。 ... [详细]
  • 深入解析Java虚拟机(JVM)架构与原理
    本文旨在为读者提供对Java虚拟机(JVM)的全面理解,涵盖其主要组成部分、工作原理及其在不同平台上的实现。通过详细探讨JVM的结构和内部机制,帮助开发者更好地掌握Java编程的核心技术。 ... [详细]
  • Linux环境下进程间通信:深入解析信号机制
    本文详细探讨了Linux系统中信号的生命周期,从信号生成到处理函数执行完毕的全过程,并介绍了信号编程中的注意事项和常见应用实例。通过分析信号在进程中的注册、注销及处理过程,帮助读者理解如何高效利用信号进行进程间通信。 ... [详细]
  • 深入理解Lucene搜索机制
    本文旨在帮助读者全面掌握Lucene搜索的编写步骤、核心API及其应用。通过详细解析Lucene的基本查询和查询解析器的使用方法,结合架构图和代码示例,带领读者深入了解Lucene搜索的工作流程。 ... [详细]
  • 异常要理解Java异常处理是如何工作的,需要掌握一下三种异常类型:检查性异常:最具代表性的检查性异常是用户错误或问题引起的异常ÿ ... [详细]
  • 采用IKE方式建立IPsec安全隧道
    一、【组网和实验环境】按如上的接口ip先作配置,再作ipsec的相关配置,配置文本见文章最后本文实验采用的交换机是H3C模拟器,下载地址如 ... [详细]
  • 丽江客栈选择问题
    本文介绍了一道经典的算法题,题目涉及在丽江河边的n家特色客栈中选择住宿方案。两位游客希望住在色调相同的两家客栈,并在晚上选择一家最低消费不超过p元的咖啡店小聚。我们将详细探讨如何计算满足条件的住宿方案总数。 ... [详细]
  • 本文详细介绍了优化DB2数据库性能的多种方法,涵盖统计信息更新、缓冲池调整、日志缓冲区配置、应用程序堆大小设置、排序堆参数调整、代理程序管理、锁机制优化、活动应用程序限制、页清除程序配置、I/O服务器数量设定以及编入组提交数调整等方面。通过这些技术手段,可以显著提升数据库的运行效率和响应速度。 ... [详细]
  • 本文详细介绍了8051系列微控制器的中断系统,特别是C51编译器中interrupt和using关键字的作用及其使用方法。通过深入分析这两个关键字的功能,帮助开发者更好地理解和优化中断程序的设计。 ... [详细]
  • 本文介绍如何从字符串中移除大写、小写、特殊、数字和非数字字符,并提供了多种编程语言的实现示例。 ... [详细]
  • 版本控制工具——Git常用操作(下)
    本文由云+社区发表作者:工程师小熊摘要:上一集我们一起入门学习了git的基本概念和git常用的操作,包括提交和同步代码、使用分支、出现代码冲突的解决办法、紧急保存现场和恢复 ... [详细]
  • 本文探讨了C++编程中理解代码执行期间复杂度的挑战,特别是编译器在程序运行时生成额外指令以确保对象构造、内存管理、类型转换及临时对象创建的安全性。 ... [详细]
  • 本文详细介绍了get和set方法的作用及其在编程中的实现方式,同时探讨了点语法的使用场景。通过具体示例,解释了属性声明与合成存取方法的概念,并补充了相关操作的最佳实践。 ... [详细]
  • 本文详细介绍了C语言中的基本数据类型,包括整型、浮点型、字符型及其各自的子类型,并探讨了这些类型在不同编译环境下的表现。 ... [详细]
author-avatar
敬昇文军3546
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有