Compare commits
15 Commits
3910c48801
...
main
Author | SHA1 | Date | |
---|---|---|---|
7d92f735c9
|
|||
b8f94f79aa
|
|||
aea4ade81b
|
|||
804501654b
|
|||
8f32bb41ba
|
|||
9bca80091f
|
|||
da9b8386e9
|
|||
1f1ea6de94
|
|||
9a7a9558b5
|
|||
6db7d9edf7
|
|||
055e0d69ae
|
|||
ddd68240e7
|
|||
7cbfe8dbc9
|
|||
915ba1a499
|
|||
590c683d98
|
14
.gitignore
vendored
Normal file
14
.gitignore
vendored
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
# Generated by Cargo
|
||||||
|
# will have compiled files and executables
|
||||||
|
debug/
|
||||||
|
target/
|
||||||
|
|
||||||
|
# Remove Cargo.lock from gitignore if creating an executable, leave it for libraries
|
||||||
|
# More information here https://doc.rust-lang.org/cargo/guide/cargo-toml-vs-cargo-lock.html
|
||||||
|
Cargo.lock
|
||||||
|
|
||||||
|
# These are backup files generated by rustfmt
|
||||||
|
**/*.rs.bk
|
||||||
|
|
||||||
|
# MSVC Windows builds of rustc generate these, which store debugging information
|
||||||
|
*.pdb
|
2
hello_cargo/.gitignore
vendored
2
hello_cargo/.gitignore
vendored
@@ -1,2 +0,0 @@
|
|||||||
Cargo.lock
|
|
||||||
target
|
|
@@ -1,8 +0,0 @@
|
|||||||
[package]
|
|
||||||
name = "hello_cargo"
|
|
||||||
version = "0.1.0"
|
|
||||||
edition = "2021"
|
|
||||||
|
|
||||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
|
||||||
|
|
||||||
[dependencies]
|
|
@@ -1,3 +0,0 @@
|
|||||||
fn main() {
|
|
||||||
println!("ǰ DZ Dz dz Ǵ ǵ Ƕ Ƿ Ǹ ǹ Ǻ ǻ Ǽ ǽ Ǿ");
|
|
||||||
}
|
|
233
notes
Normal file
233
notes
Normal file
@@ -0,0 +1,233 @@
|
|||||||
|
const is a thing
|
||||||
|
const convention is all upper with _
|
||||||
|
const evaluation info: https://doc.rust-lang.org/reference/const_eval.html
|
||||||
|
|
||||||
|
you can add arbitray scopes to modify local variables or for other purposes!
|
||||||
|
{
|
||||||
|
some random shit;
|
||||||
|
}
|
||||||
|
|
||||||
|
https://doc.rust-lang.org/book/ch03-02-data-types.html
|
||||||
|
|
||||||
|
scalars:
|
||||||
|
ints
|
||||||
|
floats
|
||||||
|
bools
|
||||||
|
chars
|
||||||
|
integer types:
|
||||||
|
8-bit i8 u8
|
||||||
|
16-bit i16 u16
|
||||||
|
32-bit i32 u32
|
||||||
|
64-bit i64 u64
|
||||||
|
128-bit i128 u128
|
||||||
|
arch isize usize
|
||||||
|
|
||||||
|
number literals
|
||||||
|
decimal 1_024
|
||||||
|
hex 0xff
|
||||||
|
oct 0o77
|
||||||
|
binary 0b1100_1011_0100_0001
|
||||||
|
byte b'E'
|
||||||
|
|
||||||
|
release builds have no overflow wrap checking
|
||||||
|
don't rely on this behavior
|
||||||
|
|
||||||
|
explicitly use
|
||||||
|
`wrapping_*` methods to do this
|
||||||
|
such as wrapping_add
|
||||||
|
Return the None value if there is overflow with the checked_* methods
|
||||||
|
Return the value and a boolean indicating whether there was overflow with the overflowing_* methods
|
||||||
|
|
||||||
|
wtf is this:
|
||||||
|
Saturate at the value’s minimum or maximum values with saturating_* methods
|
||||||
|
|
||||||
|
there are f32 and f64 floats. f64 is default cause they are about the same speed
|
||||||
|
|
||||||
|
normal math operators
|
||||||
|
int division is floor
|
||||||
|
remainder % exists
|
||||||
|
|
||||||
|
all operators:
|
||||||
|
https://doc.rust-lang.org/book/appendix-02-operators.html
|
||||||
|
|
||||||
|
|
||||||
|
type annotation:
|
||||||
|
|
||||||
|
let var: type = val;
|
||||||
|
|
||||||
|
Rust’s char type is four bytes in size and represents a Unicode Scalar Value
|
||||||
|
|
||||||
|
Compound types
|
||||||
|
|
||||||
|
primitive compound types:
|
||||||
|
tuples
|
||||||
|
arrays
|
||||||
|
|
||||||
|
Tuples:
|
||||||
|
fixed length combo of types
|
||||||
|
type is ()
|
||||||
|
|
||||||
|
pulling out the elements of a tuple into individual variables is called destructuring
|
||||||
|
|
||||||
|
Arrays:
|
||||||
|
fixed type fixed length
|
||||||
|
[]
|
||||||
|
|
||||||
|
init:
|
||||||
|
let a: [1, 2, 3];
|
||||||
|
let a: [3, 0]; // set every element to same value
|
||||||
|
reference:
|
||||||
|
let first = a[0];
|
||||||
|
they are allocated on stack
|
||||||
|
|
||||||
|
https://doc.rust-lang.org/book/ch03-03-how-functions-work.html
|
||||||
|
|
||||||
|
all function parameters must be annotated
|
||||||
|
functions consist of statements and expressions
|
||||||
|
statements perform an action and have no return value
|
||||||
|
expressions do return something
|
||||||
|
|
||||||
|
a scope block is an expression
|
||||||
|
expressions do not end with a ";", if you add a ";" it will be statement
|
||||||
|
return is explicit if the last statement in a function is an expression
|
||||||
|
|
||||||
|
https://doc.rust-lang.org/book/ch03-04-comments.html
|
||||||
|
comments
|
||||||
|
|
||||||
|
// is a comment
|
||||||
|
/* is also a comment
|
||||||
|
b*/
|
||||||
|
|
||||||
|
for some reason the doc didn't mention the second type..
|
||||||
|
|
||||||
|
|
||||||
|
https://doc.rust-lang.org/book/ch03-05-control-flow.html
|
||||||
|
control flow
|
||||||
|
|
||||||
|
there is `if``
|
||||||
|
|
||||||
|
block of code within the "if" are _arms_.
|
||||||
|
just like the match
|
||||||
|
|
||||||
|
if must recieve a bool
|
||||||
|
no bad python
|
||||||
|
if num {}
|
||||||
|
|
||||||
|
if (thing) {
|
||||||
|
else if (other thing) {
|
||||||
|
} else if (yat) {
|
||||||
|
} else {
|
||||||
|
}
|
||||||
|
|
||||||
|
use `match` for too many else ifs
|
||||||
|
|
||||||
|
if is an expression!
|
||||||
|
|
||||||
|
you can loop with `loop`
|
||||||
|
loop is an expression!
|
||||||
|
|
||||||
|
break can return a value (not for for loops though they are a statement)
|
||||||
|
break can select nest level with 'label
|
||||||
|
|
||||||
|
thats called a loop label
|
||||||
|
|
||||||
|
while loop exists
|
||||||
|
for loop exists
|
||||||
|
|
||||||
|
syntax: for x in y {}
|
||||||
|
|
||||||
|
(start..end) is a Range
|
||||||
|
(1..4).rev() is a thing
|
||||||
|
|
||||||
|
|
||||||
|
https://doc.rust-lang.org/book/ch04-01-what-is-ownership.html?search=
|
||||||
|
ownership
|
||||||
|
|
||||||
|
stack - lifo in order memory storage, stack of PLATES
|
||||||
|
pushing / popping
|
||||||
|
all data stored here must have a FIXED size
|
||||||
|
|
||||||
|
heap - rando shit goes here
|
||||||
|
allocating / deallocating
|
||||||
|
pointer to data structure goes on the stack, the actual data goes on the heap
|
||||||
|
|
||||||
|
each value in Rust has an _owner_
|
||||||
|
there can be only one owner at a time
|
||||||
|
when the owner goes out of scope, the value goes out of scope
|
||||||
|
|
||||||
|
a string has 3 parts
|
||||||
|
|
||||||
|
name | val
|
||||||
|
-----------
|
||||||
|
ptr | ------> index | val
|
||||||
|
len | 5 | -------------
|
||||||
|
cap | 5 | | 0 | 'h' |
|
||||||
|
----------- | 1 | 'e' |
|
||||||
|
|
||||||
|
|
||||||
|
string2 = string1;
|
||||||
|
create a new string data structure
|
||||||
|
have the pointer point to the same data as string1
|
||||||
|
|
||||||
|
invalid:
|
||||||
|
|
||||||
|
s2 = s1;
|
||||||
|
println!("{s1}");
|
||||||
|
|
||||||
|
there can't be two pointers to the same value!
|
||||||
|
|
||||||
|
shallow copy is a move because the first pointer is invalidated
|
||||||
|
|
||||||
|
clone is "deep copy"
|
||||||
|
|
||||||
|
s2 = s1.clone();
|
||||||
|
|
||||||
|
stack based vars don't need to clone, they `copy`, it's automatic
|
||||||
|
|
||||||
|
drop is called to return memory from the heap when it's owner goes out of scope
|
||||||
|
|
||||||
|
any type that implements the copy trait will auto copy.
|
||||||
|
a type can not implement copy and drop...
|
||||||
|
|
||||||
|
tuples will copy if all of their types support it, it will not if any one of them does not
|
||||||
|
|
||||||
|
a function can take an immutable heap mounted variable and "recast" it is mutable
|
||||||
|
|
||||||
|
https://doc.rust-lang.org/book/ch04-02-references-and-borrowing.html
|
||||||
|
references
|
||||||
|
|
||||||
|
rust has a method to let a function use a variable without moving / reassigning
|
||||||
|
ownership: references
|
||||||
|
|
||||||
|
& is a reference
|
||||||
|
* is a dereference
|
||||||
|
|
||||||
|
pass a reference to avoid _moving_ the value
|
||||||
|
references are immutable by default
|
||||||
|
|
||||||
|
&mut var // makes a mutable reference
|
||||||
|
|
||||||
|
there can be one or multiple r/o references or only one mutable reference at a time
|
||||||
|
|
||||||
|
https://doc.rust-lang.org/book/ch04-03-slices.html
|
||||||
|
slices
|
||||||
|
|
||||||
|
reference to a contiguous sequence of elements
|
||||||
|
|
||||||
|
enumerate returns a tuple with counter and reference to thing (counter, &thing)
|
||||||
|
|
||||||
|
slice is a pointer to a string, with a length
|
||||||
|
|
||||||
|
let s = String::from("a a a a");
|
||||||
|
slice = &s[0..2];
|
||||||
|
|
||||||
|
you can drop the first number if it's zero: let slice = &s[..2];
|
||||||
|
or the last number if it's the end of the string: let slice = &s[4..];
|
||||||
|
or both numbers to slice the whole thing: let slice = &s[..];
|
||||||
|
|
||||||
|
you can not create a slice that starts or ends within multibyte unicode parts
|
||||||
|
|
||||||
|
String: a heap allocated vector of bytes that is stored on the heap. It is potentially mutable.
|
||||||
|
&str: an immutable borrowed string slice.
|
||||||
|
|
||||||
|
let s = "string"; // string literal (it's a slice)
|
1
rust_book/02/guessing_game
Submodule
1
rust_book/02/guessing_game
Submodule
Submodule rust_book/02/guessing_game added at da0a40d5d3
Reference in New Issue
Block a user