A languagem mais amada segundo o StackOverflow Survey 2019
... pelo 4⁰ ano seguido.
Resultado final com performance semelhante ao C...
... mas com abstrações em algo nível
fn main() {
let a = 2;
a = 3;
println!("{}", a);
}
3 | let a = 2;
| -
| |
| first assignment to `a`
| help: make this binding mutable: `mut a`
4 | a = 3;
| ^^^^^ cannot assign twice to immutable variable
fn main() {
let mut a = 2;
a = 3;
println!("{}", a);
}
a = String::from("hello");
a
tem o valor "hello"
"
a
tem o valor "hello"
"
0x3f5cbf89 = "hello"
fn main() {
let a = String::from("hello");
let _b = a;
println!("{}", a)
}
error[E0382]: borrow of moved value: `a`
--> src/main.rs:5:20
|
4 | let _b = a;
| - value moved here
5 | println!("{}", a)
| ^ value borrowed here after move
|
= note: move occurs because `a` has type `std::string::String`, which does not implement the `Copy` trait
E se eu precisar acessar a variável em mais de um lugar?
fn main() {
let a = String::from("hello");
let _b = &a;
println!("{}", a)
}
Uma região de memória tem apenas um dono.
A região é desalocada quando o dono sair de escopo.
Uma região de memória pode ter inifitas referências.
... desde que elas não durem mais do que o dono.
É possível ter uma referência mutável de uma região de memória.
... mas para haver uma referência mutável ela deve ser a única referência.
presente := Presente { ... }
canal <- presente
presente := Presente { ... }
canal <- presente
presente.abrir()
GC não é determinístico.
localtime
SimpleDateFormatter
(structs)
struct Present {
package_color: String,
content: String
}
enum IpAddr {
V4,
V6
}
enum IpAddr {
V4(String),
V6(String),
}
let home = IpAddr::V4(String::from("127.0.0.1");
match home {
V4(address) => println!("IPv4 addr: {}", address),
V6(address) => println!("Ipv6 addr: {}", address),
}
enum Option<T> {
Some(T),
None
}
try:
something()
except Exception:
pass
try {
something();
} catch (Exception ex) {
System.out.println(ex);
}
FILE* f = fopen("someting.txt", "wb");
fprintf(f, "Done!");
fclose(f);
enum Result<T, E> {
Ok(T),
Err(E),
}
match File::create("something.txt") {
Ok(fp) => fp.write_all(b"Hello world"),
Err(err) => println!("Failure! {}", err),
}
match File::create("something.txt") {
Ok(fp) => match fp.write_all(b"Hello world") {
Ok(_) => (),
Err(err) => println!("Can't write! {}", err),
}
Err(err) => println!("Failure! {}", err),
}
let mut file = File::create("something.txt").unwrap();
file.write(b"Hello world").unwrap();
let mut file = File::create("something.txt")?;
file.write(b"Hello world")?;
OK(())
enum Result<T, E> {
Ok(T),
Err(E),
}
trait Summary {
fn summarize(&self) -> String;
}
struct Super {
phrase: String
}
impl Summary for Super {
fn summarize(&self) -> String {
self.phrase
.split_whitespace()
.map(|word| word.chars().nth(0).unwrap())
.collect();
}
}
fn get_summary(summarizable: T) -> String
where T: Summary
{
...
}
The WebAssembly System Interface
fn sum_of_squares(input: &[i32]) -> i32 {
input.iter()
.map(|&i| i * i)
.sum()
}
fn sum_of_squares(input: &[i32]) -> i32 {
input.par_iter()
.map(|&i| i * i)
.sum()
}
#[logfn(ok = "TRACE", err = "ERROR")]
fn call_isan(num: &str) -> Result<Success, Error> {
if num.len() >= 10 && num.len() <= 15 {
Ok(Success)
} else {
Err(Error)
}
}