- Мало знаний, большой вызов! Эта статья участвует в "Необходимые знания для программистов«Творческая деятельность.
Базовая грамматика 2
Поскольку грамматика ржавчины сильно отличается от большинства языковых грамматик, изучайте грамматику медленно.
Юаньцзу
-
tuple
- Если так написано
let aa = (1i32,true);
- представляет собой первый
i32
тип, второй имеет тип bool - Посмотрите на код ниже
- Если так написано
fn main() {
let p = (1i32, 2i32);
let (a , b) = p;
let x = p.0;
let y = p.1;
// 输出 1 2 1 2
println!("{} {} {} {}",a,b,x,y);
}
- в
a,b
предназначен для использованиясопоставление с образцом- а такжеx,yпредназначен для использованиячисловой индекс
перечислить
- Обычно читайте перечисление, будет использоватьсопоставление с образцом
use std::num::NonZeroU8;
enum Number {
Int(i32),
Float(f32)
}
fn input_num(num : &Number) {
match num {
&Number::Int(v) => println!("Integer {}",v),
&Number::Float(v) => println!("Float {}",v),
}
}
fn main() {
let n : Number = Number::Int(100);
// 输出 Integer 100
input_num(&n);
}
основные арифметические выражения
fn main() {
let x = 100;
let y = 10;
// 110 90 1000 10 0
println!("{} {} {} {} {}", x + y, x - y, x * y, x / y, x % y);
}
Небольшие правила кода
- Если есть суждение о непрерывном равенстве, необходимо добавить скобки по семантике.
- Если код ниже,
a==b==c
Без скобок компилятор сообщит об ошибке
- Если код ниже,
fn calculate(a: bool,b: bool,c: bool) -> bool {
(a == b) == c
}
fn main() {
// true
println!("{}",calculate(false,true,false));
}
if-else
fn func(i: i32) {
if i > 10 && i < 20 {
print!("i > 10");
}else if i > 20 && i < 30 {
print!("i > 20")
}else {
print!("i > 30")
}
}
fn main() {
// i > 30
func(40);
}
функция
fn add(t : (i32,i32)) -> i32 {
t.0 + t.1
}
fn main() {
//输出 3
println!("{}",add((1,2)))
}
- Вариант вышеуказанной функции
fn add((x,y) : (i32,i32)) -> i32 {
x + y
}
fn main() {
//输出 3
println!("{}",add((1,2)))
}
- Когда преобразование типа встречается с функцией
- add1 должен передать параметр
- И add2 должен передать кортеж, два
i32
переменная типа - Следующий код эквивалентен
func
преобразование типов
fn add1(t : (i32,i32)) -> i32 {
t.0 + t.1
}
fn add2((x,y) : (i32,i32)) -> i32 {
x + y
}
fn add3(x: i32,y: i32) -> i32 {
x + y
}
fn main() {
let mut func : fn((i32,i32)) -> i32 = add1;
func = add2;
//输出 7
println!("{}",func((2,5)))
}
Функция условного суждения
fn check(x : bool) -> i32 {
let p = if x {
panic!("Error!");
} else {
7
};
return p;
}
fn main() {
let func = check(false);
//输出 7
println!("{}",func)
}
Рекурсивный Фибоначчи
fn fib(i : u32) -> u64 {
if i == 1 || i == 2 {
return 1
} else {
return fib(i - 1) + fib(i - 2);
}
}
fn main() {
let c = fib(10);
//输出 55
println!("{}",c)
}
trait
trait Shape {
fn area(self: &Self) -> f64;
}
struct Circle {
r: f64,
}
impl Shape for Circle {
fn area(self: &Self) -> f64 {
std::f64::consts::PI * self.r * self.r
}
}
fn main() {
let c = Circle {r : 3f64};
//输出 圆的面积为 28.274333882308138
println!("圆的面积为 {}",c.area())
}
- Это видно из приведенного выше кода
- если есть
Circle
экземпляр типа c, мы можем вызвать внутреннийc.area()
- в состоянии пройти
self.r
для доступа к внутренним членам
- если есть