百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

Java程序员学习Rust编程 - infoworld

myzbx 2025-09-06 08:24 7 浏览

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

根据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中,接口定义了整个类的表面,而不是零散地定义方法。

原文链接:
https://www.jdon.com/59357

相关推荐

微信又双叒叕更新了!这次是安卓版

澎湃新闻综合报道近日安卓版微信正式更新了8.0.10版主要有四大更新日常使用起来会更加方便一起来看看吧1朋友圈视频封面在此之前,朋友圈背景一直只能放静态图片,但此次更新后,可以从视频号中选择一段...

镜子里的你和照片里的你,哪个更真实?

不知道大家有没有这样的经历。聚餐、团建……一群人拍合照,拍完之后,我们满心期待地放大照片,却惊慌失措地发现——怎么自己又被拍得这么丑!但这时,别人总是会说道——「这就是你平常的样子啊。」可是,我们平时...

歼20战斗机现身珠海,首次公开静态展示,体现解放军的自信和强大

日本航空自卫队在9月份举行了三泽基地开发日活动,期间出动12架F-35A闪电II战斗机进行了公开展示,不过仅仅是编队通场飞过而已。日本航空自卫队仅仅动用1架F-35A战斗机进行了机动飞行表演,从公开的...

Java类初始化阶段深度解析:执行顺序与线程安全

一、初始化阶段核心机制二、分步详解与代码验证1.初始化触发条件主动使用场景:publicclassInitTrigger{static{System.out.pr...

深入剖析 Java 类加载机制:原理、优化与实践

作为Java开发者,你是否遇到过这样的场景:线上服务突然抛出NoClassDefFoundError,但本地调试却一切正常;或者明明引入了依赖JAR,却始终报ClassNotFoundExcep...

SUID/SGID是啥?如何让普通用户拥有root的能力?

原文链接:「链接」在Linux系统中,权限控制是一项至关重要的安全机制。除了常见的r(读)、w(写)和x(执行)权限外,还有三种特殊权限位常被忽视:SUID(SetUserID)、SGID...

数码宝贝新世纪:SP奥米加兽AS情报泄露,是否也是强力辅助?

大家好!我是小飉[liáo],欢迎来阅!情怀手游《数码宝贝新世纪》官方不按套路出牌,这次公布的入围测试的人员名单,但是并没有公布SP奥米加兽AS的能力情报,还好广大网友给力。次日,在论坛,以及...

抽象类(abstract class)与接口(interface)

A.核心概念1.抽象类-定义:带有abstract修饰符的类,不能被实例化,用于定义一组方法签名和可选的部分公共实现。-特性:-可以包含字段、构造函数、已实现的方法(带方法体)和抽象方法(...

S39结束时间确定,新赛季段位继承公布,大量皮肤在7月初集体上线

文/静海君如果说之前都还是猜测的话,那游戏内的一个变动,基本100%确定了新赛季(S40)的开启时间。新赛季的开启时间关于新赛季的开启时间,目前主要有两个线索。第一个关于新赛季开启时间的线索是「游戏内...

一篇文章掌握整个JVM,JVM超详细解析!!!

不懂JVM看完这一篇文章你就会非常懂了,文章很长,非常详细!!!先想想一些问题1我们开发人员编写的Java代码是怎么让电脑认识的首先先了解电脑是二进制的系统,他只认识01010101比如我们经常要...

项目用 JDK17 后,bug 少了、速度快了!这 4 个好处太实在

别再死守JDK8了!去年把电商项目升级到JDK17,团队直接爽翻:代码量少写1/3,大促再也不卡顿,运维半夜不call人,连测试都夸bug少了。今天就说真话,JDK17在项目里的4...

法定继承有顺序:在法定继承人中,谁应该优先继承?

免费问律师_法律咨询免费24小时律师在线解答-法临网“父母去世没留遗嘱,兄弟姐妹争遗产闹上法庭!”法定继承中,谁优先拿财产?《民法典》明确“顺序+份额”规则,一文说清关键点,避免家庭内耗!一、法定...

前端必会:ES5寄生继承 vs ES6 Class继承

大家好,我是谦!说到继承,估计不少前端开发者都踩过坑。尤其是在ES5到ES6的过渡阶段,我们写代码时常常被问到:“你用的是原型继承还是Class继承?”再加上面试官特别喜欢追问底层实现——...

子女入了外籍能否继承父母国内的房产呢?

大家好,这里是家理范律,专注遗产继承、婚姻家事领域!-很多加入外籍的朋友都纠结:自己还能继承国内父母的房产吗?答案是可以继承,但流程远比想象复杂!-真实案例:美籍华人张先生,拿着父母在加州公证的遗嘱回...

J.A.C.S | 基于化学类型和靶点的基因组挖掘以寻找一种新的细菌肽脱甲酰酶天然产物抑制剂

大家好,今天推送的文章是2025年6月发表在JournaloftheAmericanChemicalSociety上的“Chemotype-andTarget-DrivenGenome...