diff --git a/_images/not-everything-is-flowers.jpg b/_images/not-everything-is-flowers.jpg new file mode 100644 index 0000000..ea78f34 Binary files /dev/null and b/_images/not-everything-is-flowers.jpg differ diff --git a/porque-rust.html b/porque-rust.html index 5f60b88..74565b5 100644 --- a/porque-rust.html +++ b/porque-rust.html @@ -72,49 +72,67 @@
- Basic (com números e estruturado), dBase III Plus, - Clipper, Pascal, Cobol, Delphi (ObjectPascal), - C, C++, ActionScript (Flash), PHP, JavaScript, - Python, Objective-C, Clojure, Java, Scala - , Rust. -
- - -- - A linguagem 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
- -
+
+ Basic (com números e estruturado), dBase III Plus, + Clipper, Pascal, Cobol, Delphi (ObjectPascal), + C, C++, ActionScript (Flash), PHP, JavaScript, + Python, Objective-C, Clojure, Java, Scala + , Rust. +
+ + ++ + A linguagem 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() -> u8 {
let a = 2;
a = 3;
println!("{}", a);
a
}
-
+
-
+
+
3 | let a = 2;
| -
| |
@@ -303,16 +314,16 @@ fn main() -> u8 {
| help: make this binding mutable: `mut a`
4 | a = 3;
| ^^^^^ cannot assign twice to immutable variable
-
+
-
+
+
3 | let a = 2;
| -
| |
@@ -320,16 +331,16 @@ fn main() -> u8 {
| help: make this binding mutable: `mut a`
4 | a = 3;
| ^^^^^ cannot assign twice to immutable variable
-
+
-
+
+
3 | let a = 2;
| -
| |
@@ -337,98 +348,96 @@ fn main() -> u8 {
| help: make this binding mutable: `mut a`
4 | a = 3;
| ^^^^^ cannot assign twice to immutable variable
-
+
-
+
+
let a = String::from("hello");
-
-
-
-
- "Variável a
tem o valor "hello"
"
-
-
- Em todas as linguagens que eu usei, sempre que via
- uma atribuição, eu pensava "a variável X tem o
- valor Y" -- mesmo em C.
-
-
-
-
-
- "Posição de memória apontada por a
tem o valor "hello"
"
-
-
-
-
+
+
+
+
+ "Variável a
tem o valor "hello"
"
+
+
+ Em todas as linguagens que eu usei, sempre que via
+ uma atribuição, eu pensava "a variável X tem o
+ valor Y" -- mesmo em C.
+
+
+
+
+
+ "Posição de memória apontada por a
tem o valor "hello"
"
+
+
+
+
0x3f5cbf89 = "hello"
-
-
-
-
- Nunca uma linguagem me fez "despensar" no nome da
- variável pra pensar que ela representa, na verdade,
- uma posição de memória.
-
-
-
-
-
-
-
- É mais ou menos isso que Rust "pensa" internamente
- quando vê uma variável: uma posição de memória, de
- um tamanho já definido, de um tipo definido.
-
- E essa posição de memória *pertence* apenas à
- variável indicada.
-
-
-
-
-
+
+
+
+
+ Nunca uma linguagem me fez "despensar" no nome da
+ variável pra pensar que ela representa, na verdade,
+ uma posição de memória.
+
+
+
+
+
+
+
+ É mais ou menos isso que Rust "pensa" internamente
+ quando vê uma variável: uma posição de memória, de
+ um tamanho já definido, de um tipo definido.
+
+ E essa posição de memória *pertence* apenas à
+ variável indicada.
+
+
+
+
+
fn main() {
let a = String::from("hello");
let _b = a;
println!("{}", a)
}
-
-
+
+
+
+
error[E0382]: borrow of moved value: `a`
--> src/main.rs:5:20
|
@@ -440,293 +449,241 @@ error[E0382]: borrow of moved value: `a`
= 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?
+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 referência nada mais é que um ponteiro para um
- "controlador" de uma região de memória.
-
-
-
-
- Regras do Borrow Checker
-
-
- Uma região de memória tem apenas um dono.
-
-
-
- Passar um valor (região de memória) de uma variável
- para outra, troca o dono.
-
-
-
- A região é desalocada quando o dono sair de escopo.
-
-
-
- Uma coisa engraçada sobre "quando sair de escopo" é
- que existe uma função semelhante ao "free()" do C,
- chamada "drop". Essa função não tem nada no corpo,
- e recebe um parâmetro (sem ser por referência), se
- tornando a dona da memória; assim, como ela termina
- exatamente naquele ponto, a região de memória é
- liberada.
-
-
-
-
- Drop
-
-
+
+
+
+
+
+
+
+ Uma referência nada mais é que um ponteiro para um
+ "controlador" de uma região de memória.
+
+
+
+
+ Regras do Borrow Checker
+
+
+ Uma região de memória tem apenas um dono.
+
+
+
+ Passar um valor (região de memória) de uma variável
+ para outra, troca o dono.
+
+
+
+ A região é desalocada quando o dono sair de escopo.
+
+
+
+ Uma coisa engraçada sobre "quando sair de escopo" é
+ que existe uma função semelhante ao "free()" do C,
+ chamada "drop". Essa função não tem nada no corpo,
+ e recebe um parâmetro (sem ser por referência), se
+ tornando a dona da memória; assim, como ela termina
+ exatamente naquele ponto, a região de memória é
+ liberada.
+
+
+
+
+ Drop
+
+
pub fn drop<T>(_x: T) { }
-
-
-
-
- Regras do Borrow Checker
-
-
- Uma região de memória pode ter infinitas referências.
-
-
-
- ... desde que elas não durem mais do que o dono.
-
-
-
- Não é possível ter uma função que cria uma variável
- e retorna apenas uma referência para essa variável:
- no momento que a função for encerrada, ela irá
- levar todas as variáveis com ela e as referências
- se tornaram inválidas.
-
-
-
-
- Regras do Borrow Checker
-
-
- É 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.
-
-
-
-
-
-
-
- E o que isso ajuda, no final das contas?
-
-
-
-
-
-
-
-
- Microsoft: 70 percent of all security bugs are memory safety issues
-
-
-
- Swift 5 Exclusivity Enforcement
-
-
- A ideia do borrow checker é tão interessante que
- até o Swift 5 agora tem o seu próprio borrow
- checker (com outro nome, mas o princípio da coisa é
- basicamente o mesmo, apesar de ser um pouco mais
- leve no Swift).
-
-
-
localtime
SimpleDateFormatter
+
+ + Uma região de memória pode ter infinitas 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. +
++ Swift 5 Exclusivity Enforcement +
+ ++ Verona: Research programming language for concurrent ownership +
+
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),
}
-
-
-
+
+
try:
something()
except Exception:
pass
-
-
+
+
+
+
+var obj = null;
try {
- something();
+ obj = get_object();
} catch (Exception ex) {
System.out.println(ex);
}
-
-
+obj.do_something();
+
+
+
+
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(_) => (),
@@ -734,94 +691,107 @@ match File::create("something.txt") {
}
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")
+ .expect("ERROR OPENING");
+file.write(b"Hello world")
+ .expect("ERROR WRITING");
+
+
+
+
+
let mut file = File::create("something.txt")?;
file.write(b"Hello world")?;
OK(())
-
-
+
+
struct Gift {
package_color: String,
content: String
}
-
+
-
+
let presente = Gift { package_color: "red", content: "A GIFT!" };
-
-
+
+ Structs Genéricas
+
struct Point<T> {
x: T,
y: T
}
-
-
+
+
+
let my_point = Point<f32>(x: 1.0, y: 2.0);
-
-
+let my_point = Point(x: 1.0, y: 2.0);
+
+
+
enum Result<T, E> {
Ok(T),
Err(E),
}
-
-
+
trait Summary {
fn summarize(&self) -> String;
}
-
-
+
struct Phrase {
phrase: String
}
@@ -834,55 +804,55 @@ impl Summary for Phrase {
.collect()
}
}
-
-
+
+
fn get_summary<T>(summarizable: T) -> String
where T: Summary
{
...
}
-
- "Cargo is the Rust package manager"
- -- "Cargo downloads your Rust package’s dependencies, - compiles your packages, makes distributable - packages, and uploads them to crates.io, the Rust - community’s package registry." -
-"Cargo is the Rust package manager"
+ ++ "Cargo downloads your Rust package’s dependencies, + compiles your packages, makes distributable + packages, and uploads them to crates.io, the Rust + community’s package registry." +
+
#[cfg(test)]
mod tests {
#[test]
fn testing() {
}
}
-
-
+
$ cargo test
Compiling adder v0.1.0 (file:///projects/adder)
Finished dev [unoptimized + debuginfo] target(s) in 0.22 secs
@@ -890,21 +860,19 @@ $ cargo test
running 1 test
test tests::testing ... ok
-
-
+
#[logfn(ok = "TRACE", err = "ERROR")]
fn call_isan(num: &str) -> Result<Success, Error> {
if num.len() >= 10 && num.len() <= 15 {
@@ -913,30 +881,41 @@ fn call_isan(num: &str) -> Result<Success, Error> {
Err(Error)
}
}
-
-