返回介绍

1.2 Hello, World!

发布于 2024-10-13 11:25:27 字数 3129 浏览 0 评论 0 收藏 0

从零开始,main 是用户代码入口函数,无参数和返回值。

// main.rs

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

获取命令行参数,返回退出码。

use std::env::args;
use std::process::exit;

fn main() {
  println!("{:?}", args());
  exit(2);
}

提示: 鉴于编译速度较慢,优先使用 cargo c 进行语法检查,需要动态调试时再编译。

技巧

对接下来学习有帮助的一些小知识。

输出

向终端输出字符串。

! 结尾表示该表达式是一个宏调用。

  • print! : io::stdout
  • println! :
  • eprint! : io:stderr
  • eprintln! :

格式:

  • {} : 自动顺序。
  • {0} : 指定序号。
  • {name} : 命名参数,或作用域内同名变量。
  • {:?}, {:#?} : 调试格式。
  • {:p} : 指针。

std::fmt

fn main() {
  println!("{}, {}", 1, 2);  // 1, 2
  println!("{1}, {0}", 1, 2);  // 2, 1
  println!("{x}, {y}", y = 1, x = 2); // 2, 1
}

调试格式有助于观察,比如按代码样式输出结构体。

#[derive(Debug)]
struct Person<'a> {
  name: &'a str,
  age : u8
}

fn main() {
  let name = "Peter";
  let age = 27;
  let peter = Person { name, age };

  println!("{:?}", peter);
}

// Person { name: "Peter", age: 27 }

断言

相比输出,使用断言更易阅读。

fn main() {
  let x = 1;
  let y = 1;

  assert!(x == y);
  assert_eq!(x, y);
  assert_ne!(x, y);
}

还有专门用于调试的断言。

fn main() {
  debug_assert_eq!(1, 2);  // --release 不生成相关代码。
}

输出表达式

输出表达式用于调试查看,并返回结果。

fn main() {
  let a = 1;
  let b = dbg!(a + 1);  // output: [src/main.rs:3] a + 1 = 2

  assert_eq!(b, 2);
}

类型信息

获取目标类型和尺寸信息。

fn type_of<T>(_: &T) -> &'static str {
  std::any::type_name::<T>()
}

fn size_of<T>(_: &T) -> usize {
  std::mem::size_of::<T>()
}
fn main() {
  let d = [1, 2, 3, 4, 5];
  
  assert_eq!(type_of(&d), "[i32; 5]");
  assert_eq!(size_of(&d), 20);
}

获取对象实例长度。

use std::mem::size_of_val;

fn main() {
  let d = [1i64, 2, 3];
  
  assert_eq!(size_of_val(&d), 24);
  assert_eq!(size_of_val(&d), size_of_val(&d[0]) * d.len());
}

执行时间

自定义宏,获取表达式执行时间。

#[macro_export]
macro_rules! elapsed {
  ($e: expr) => (
    use std::time::Instant;
    let now = Instant::now();
    { $e; }
    println!("elapsed: {:?}", now.elapsed());
  );
}

fn main() {
  elapsed!({
    println!("hello");
  });
}

// hello
// elapsed: 16.6µs

编译控制

添加注解(attribute),抑制无害警告信息。避免编译器输出过多提示,影响查看。

#![allow(dead_code)]
#![allow(unused_variables)]
#![allow(unused_assignments)]
#![allow(unused_imports)]

尚未完成

标记尚未完成的代码,可用于测试结果提示。

  • todo! : 未完成。
  • unimplemented! : 未实现。
fn test() {
  todo!();
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文