add ownersystem examples
parent
9a5cd58b8c
commit
bfc4055bde
|
|
@ -0,0 +1,26 @@
|
|||
// $ rustc ownersystem_1.rs
|
||||
// $ ./ownersystem_1
|
||||
struct Bob {
|
||||
n: Vec<i32>
|
||||
}
|
||||
|
||||
impl Bob {
|
||||
fn new() -> Bob {
|
||||
Bob { n: Vec::new() }
|
||||
}
|
||||
}
|
||||
|
||||
fn func_1() {
|
||||
let n = Bob::new();
|
||||
func_2(n);
|
||||
//is now out of scope as func_2 owns n now.
|
||||
//println!("{}", bob.n[0]);
|
||||
}
|
||||
|
||||
fn func_2(b: Bob) {
|
||||
println!("{}", b.n[0]);
|
||||
}
|
||||
|
||||
fn main() {
|
||||
func_1();
|
||||
}
|
||||
|
|
@ -0,0 +1,26 @@
|
|||
// $ rustc ownersystem_2_borrowing.rs
|
||||
// $ ./ownersystem_2_borrowing
|
||||
struct Bob {
|
||||
n: Vec<i32>
|
||||
}
|
||||
|
||||
impl Bob {
|
||||
fn new() -> Bob {
|
||||
Bob { n: Vec::new() }
|
||||
}
|
||||
}
|
||||
|
||||
fn func_1() {
|
||||
let n = Bob::new();
|
||||
func_2(&n);
|
||||
//is now in scope as func_2 just got a read only reference.
|
||||
println!("{}", n.n[0]);
|
||||
}
|
||||
|
||||
fn func_2(b: &Bob) {
|
||||
println!("{}", b.n[0]);
|
||||
}
|
||||
|
||||
fn main() {
|
||||
func_1();
|
||||
}
|
||||
|
|
@ -0,0 +1,33 @@
|
|||
// $ rustc ownersystem_3_borrowing.rs
|
||||
// $ ./ownersystem_3_borrowing
|
||||
struct Bob {
|
||||
n: Vec<i32>
|
||||
}
|
||||
|
||||
impl Bob {
|
||||
fn new() -> Bob {
|
||||
Bob { n: Vec::new() }
|
||||
}
|
||||
}
|
||||
|
||||
fn func_1() {
|
||||
let n = Bob::new();
|
||||
let n1 = &n;
|
||||
let n2 = &n;
|
||||
func_2(n1);
|
||||
func_3(n2);
|
||||
//works because both func_2 and func_3 only got read only references
|
||||
println!("{}", n.n[0]);
|
||||
}
|
||||
|
||||
fn func_2(b: &Bob) {
|
||||
println!("{}", b.n[0]);
|
||||
}
|
||||
|
||||
fn func_3(b: &Bob) {
|
||||
println!("{}", b.n[0]);
|
||||
}
|
||||
|
||||
fn main() {
|
||||
func_1();
|
||||
}
|
||||
|
|
@ -0,0 +1,34 @@
|
|||
// $ rustc ownersystem_4_mutable.rs
|
||||
// $ ./ownersystem_4_mutable
|
||||
struct Bob {
|
||||
n: Vec<i32>
|
||||
}
|
||||
|
||||
impl Bob {
|
||||
fn new() -> Bob {
|
||||
Bob { n: Vec::new() }
|
||||
}
|
||||
}
|
||||
|
||||
fn func_1() {
|
||||
let mut n = Bob::new();
|
||||
let n1 = &mut n;
|
||||
// doesn't work because there is already a mutable borrowing
|
||||
//let n2 = &n;
|
||||
func_2(n1);
|
||||
//func_3(n2);
|
||||
//works because both func_2 and func_3 only got read only references
|
||||
println!("{}", n.n[0]);
|
||||
}
|
||||
|
||||
fn func_2(b: &mut Bob) {
|
||||
println!("{}", b.n[0]);
|
||||
}
|
||||
|
||||
fn func_3(b: &Bob) {
|
||||
println!("{}", b.n[0]);
|
||||
}
|
||||
|
||||
fn main() {
|
||||
func_1();
|
||||
}
|
||||
|
|
@ -0,0 +1,30 @@
|
|||
// $ g++ -o raii raii.cpp
|
||||
// https://en.wikipedia.org/wiki/Resource_acquisition_is_initialization
|
||||
#include <cstdio>
|
||||
class MyClass {
|
||||
int *n;
|
||||
public:
|
||||
MyClass(int x)
|
||||
{
|
||||
this->n = new int[x];
|
||||
printf("constructor\n");
|
||||
}
|
||||
~MyClass()
|
||||
{
|
||||
delete this->n;
|
||||
printf("deconstructor\n");
|
||||
}
|
||||
int* get_n()
|
||||
{
|
||||
return this->n;
|
||||
}
|
||||
};
|
||||
|
||||
int main()
|
||||
{
|
||||
MyClass *b = new MyClass(5);
|
||||
int *xs = b->get_n();
|
||||
printf("%d\n", xs[0]);
|
||||
delete b;
|
||||
printf("%d\n", xs[0]);
|
||||
}
|
||||
Loading…
Reference in New Issue