首页 > 其他分享 >3.Rust的“Hello World”

3.Rust的“Hello World”

时间:2022-10-06 18:32:35浏览次数:70  
标签:rs error world World main Hello Rust

在部署好Rust的编译程序之后,就可以编写Rust的第一个程序了。按照惯例,都是“Hello World”。

在Rust的官方书的1.2节就是“Hello World”。在这个章节中,首先创建了一个目录来容纳程序的源文件以及程序本身,文中也说了,这不是必需的,但是一个良好的习惯,然后就是创建一个名为main.rs的文件,并在其中输入如下的代码:

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

保存后,在命令行中使用rustc对它进行编译:

rustc main.rs

不出意外的话就会得到一个main.exe程序(Windows平台)以及main.pdb,执行main.exe就可以看到如下的结果:

Hello, world!

由于是新接触Rust,对什么都好奇,光是这一个小小的“Hello World”就能找到很多种探索的方式。下面我就来分享一下我的探索旅程。

1.修改文件名,看看文件名,看看是不是和Java那样,文件名对文件内容也产生了影响。​​先把文件名改成first.rs​​,然后再编译。

结果是,编译得到的exe、pdb文件的文件名变了,变成了first,也就是说,在rustc默认的编译条件下,它会把源文件的文件名直接带入到可执行文件上。

问题:如果有多个文件组成的工程,那么编译之后,默认的可执行文件会是哪个名字?

2.修改源文件的后缀名,文档中提到Rust的源文件后缀名都是rs,那么如果改掉,编译器就不认是了吗?

首先随便把后缀名改成别的,如rs0。然后使用编译器编译。

结果发现,它依然能编译成可执行文件,看来这个rs的后缀名是个约定俗成,并不具有强制力。

下面开始,对文件内容进行编辑了。

3.首先,把fn这个去掉,看看会弹出什么提示。

error: expected one of `!` or `::`, found `(`
--> F:\Code Space\hello_world\main.rs:1:5
|
1 | main() {
| ^ expected one of `!` or `::`

error: aborting due to previous error

这提示,说实话,还真的不容易认,并没有直接告诉你main缺少了fn类型声明,估计在Rust中,这种写法是有意义的。

4.把main换成别的名称看看。

error[E0601]: `main` function not found in crate `main`
--> F:\Code Space\hello_world\main.rs:3:2
|
3 | }
| ^ consider adding a `main` function to `F:\Code Space\hello_world\main.rs`

error: aborting due to previous error

For more information about this error, try `rustc --explain E0601`.

这个错误提示比较明确,直接说明了没找到main函数,还建议我们添加一个main函数到文件里。

5.把main函数的参数元组去掉。

error: expected one of `(` or `<`, found `{`
--> F:\Code Space\hello_world\main.rs:1:9
|
1 | fn main {
| ^ expected one of `(` or `<`

error: aborting due to previous error

这个错误提示指向也不是特别明确,但是一般这种缺参数元组的错误很少有码农会犯的。

6.把main函数的大括号去掉。

error: expected one of `->`, `where`, or `{`, found `println`
--> F:\Code Space\hello_world\main.rs:2:2
|
1 | fn main()
| - expected one of `->`, `where`, or `{`
2 | println!("Hello, world!");
| ^^^^^^^ unexpected token

error: aborting due to previous error

这个错误提示还算比较明显,不过,就和上一个错误一样,不太有可能有人犯这样的错误,毕竟任何IDE中,都会有比较明显的提示。

7.把main的大括号{放在独立的一行。这个举动不会构成错误,看来Rust和大多数语言一样,不像Go那种,连括号放哪都要有规定。毕竟,这种括号放哪仅仅表示一种习惯,遵循团队内一致就行了。

8.去掉函数内的缩进。这个举动也不影响,不会像Python那样视为语法错误。不过良好的缩进级别是非常必须的,对理清代码关系相当有帮助,还是应该坚持。

9.把println!的!去掉。

error[E0423]: expected function, found macro `println`
--> F:\Code Space\hello_world\main.rs:2:2
|
2 | println("Hello, world!");
| ^^^^^^^ not a function
|
help: use `!` to invoke the macro
|
2 | println!("Hello, world!");
| +

error: aborting due to previous error

For more information about this error, try `rustc --explain E0423`.

这个错误提示还是比较明显的,告诉我们println不是一个函数。我记得按照Rust的说法,println是一个宏,一定要使用!来与函数区分。

问题:Rust的宏与C/C++里的宏有没有什么相似处。

10.把"Hello, world!"的引号去掉。

error: expected one of `(`, `[`, or `{`, found `<eof>`
--> F:\Code Space\hello_world\main.rs:2:23
|
2 | println!(Hello, world!);
| ^ expected one of `(`, `[`, or `{`

error: aborting due to previous error

这错误提示其实也不明确,我估计是看见了!这个符号,以为是某种宏。不过去掉引号本身也就意味着这一串不是字符串字面值了,这种错误应该很少码农会犯。

11.把分号去掉。在这个程序中不会有事,我记得因为这个程序中这一句是函数的最后一行,所以即使不带分号也可以认为是符合语法的。但我觉得,无论是不是,还是加上分号,除非有明确的理由不允许加。


好了,这就是我对Rust第一个程序的一些折腾,希望对日后的学习有所帮助。

标签:rs,error,world,World,main,Hello,Rust
From: https://blog.51cto.com/solitarycandle/5733949

相关文章

  • bcc之hello world
    bcc代码——Hello,world1、简单监控clone()系统调用,将相关的信息打印出来#!/usr/bin/pythonfrombccimportBPFBPF(text="""intkprobe__sys_clone(void*ctx){ bpf......
  • Rust从入门到精通10-所有权
    在介绍rust所有权时,我们先介绍内存管理的一些基础概念。1、堆和栈一个进程在执行的时候,它所占用的内存虚拟空间一般被分割为好几个区域,我们称为”段“(Segment)。常见的几个......
  • Rust从入门到精通09-模式解构
    "PatternDestructure"是Rust中一个重要且实用的设计。通常翻译为“模式解构”。Destructure单词翻译为把原来的结构肢解为单独的、原始的部分。下面我们举例说明什么......
  • Rust学习 - Sized trait
    Sizedtrait的作用是什么?编译期用它来识别在编译期确定大小的类型。Sizedtrait是空trait,仅仅作为标签trait供编译期使用。真正起“打标签”作用的是属性#[lang="s......
  • Rust 链式调用引发的问题 consider using a `let` binding to create a longer lived
        temporaryvaluedroppedwhileborrowedconsiderusinga`let`bindingtocreatealongerlivedvalue为什么会报这个错?因为maps.lock.unwrap.values.........
  • Rust从入门到精通08-字符串
    Rust字符串相对于其它语言有点复杂,主要是跟所有权有关。Rust字符串涉及两种类型:&str和String1、&str-字面量str是Rust的内置类型,&str是str的借用。可以理解为字符......
  • 第一个Java程序hello world
    day4:我的第一个JAVA程序HelloWorldpublicclassMain{publicstaticvoidmain(String[]args){System.out.println("hello,world");}}注意事项......
  • hello-world
    C++#include<bits/stdc++.h>usingnamespacestd;intmain(){cout<<"HelloWorld"<<endl;return0;}Pythonprint("HelloWorld");Javapublicc......
  • LIME模型---"Why Should I Trust You?": Explaining the Predictions of Any Classifi
    文章核心思想速读:提出了一个LIME解释技术能够对任何分类器做出的预测进行解释。L指LOCAL,意思是模型是针对局部某个样本的解释,而不是所有样本I指:INTERPRETABLE,可......
  • Hello World
    1.随便新建一个文件夹存放代码2.存放一个java文件●文件后缀名问.java●Hello.java3.编写代码publicclassHello{publicstaticvoidmain(String[]args){S......